//循环接收数据
iThisRecvLen=recv(SockClient,strRecvBuf+iAllRecvLen,COM_STR_LEN,0);
iAllRecvLen+=iThisRecvLen;
}
被控端收到命令字符串后,调用ExitWindowsEx函数关闭或重启本客户机。ExitWindowsEx函数在Windows9x系统中可直接使用,在Windows2000或WindowsXP以上系统中默认的情况下进程不具有关机权限,所以要将当前进程的关机权限Enabled。先通过OpenProcessToken函数获得当前进程访问令牌的句柄,该函数声明如下:
BOOL OpenProcessToken (HANDLE ProcessHandle,DWORD DesiredAccess,PHANDLE TokenHandle);
第一参数是要修改权限的进程句柄;第二个参数为对该令牌的访问类型;第三个参数即获得的进程访问令牌的句柄。
为了修改进程令牌权限,还要先定义一个令牌权限TOKEN_PRIVILEGES类型结构变量,该结构定义如下:
typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount;
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
} TOKEN_PRIVILEGES
第一个成员变量为权限数量;第二个成员变量为LUID_AND_ATTRIBUTES类型结构变量数组。该结构定义如下:
typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid;
DWORD Attributes;
} LUID_AND_ATTRIBUTES;
第一个成员变量为某权限的本地唯一标识;第二个成员变量为该权限属性。
为了获取某权限的本地唯一标识,需要通过LookupPrivilegeValue函数,该函数声明如下:
BOOL LookupPrivilegeValueA(LPCSTR lpSystemName,LPCSTR lpName,PLUID lpLuid);
第一个参数为系统名,本地系统为NUL;第二个参数为权限名;第三个参数为返回的权限本地唯一标识。
定义好了令牌权限TOKEN_PRIVILEGES结构变量后,最后通过AdjustTokenPrivileges函数修改访问令牌权限,该函数声明如下:
BOOL AdjustTokenPrivileges (HANDLE TokenHandle,BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState,DWORD BufferLength,PTOKEN_PRIVILEGES reviousState, PDWORD ReturnLength);
|