第一个参数为访问令牌句柄;第二个参数为是否取消所有权限;第三个参数为前面定义好的令牌权限;后面三个参数针用于保存修改前的令牌权限,分别为用于保存的内存长度、保存的内存地址、实际保存的内存长度。
具体代码如下:
if(strcmp("POWOFF",strRecvBuf)==0)
{
closesocket(SockClient);
WSACleanup();
if(GetVersion()<0x80000000)//判断WINDOWS系统版本号
{
HANDLE hProcessToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hProcessToken);
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hProcessToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
}
//强迫所有进程退出、关闭计算机并切断电源
ExitWindowsEx(EWX_FORCE|EWX_POWEROFF,0);
}
在Windows2000或WindowsXP以上系统中,也可用InitiateSystemShutdown函数代替ExitWindowsEx函数关闭本机,InitiateSystemShutdown函数的使用在下面介绍。
2.无被控端软件
由于Windows2000、WindowsXP以上的系统本身支持远程关机,所以也可不编写被控端软件,Windows API中已提供现成的函数InitiateSystemShutdown,其声明如下:
BOOL InitiateSystemShutdownA(LPSTR lpMachineName,LPSTR lpMessage,DWORD dwTimeout,BOOL bForceAppsClosed,BOOL bRebootAfterShutdown);
第一个参数为机器名,本机为NULL;第二个参数为关机提示对话框中显示的消息;第三个参数为关机前提示的时间;第四个参数为是否强制关闭应用程序;第五个参数为是否重启。
远程关机需要具有相应权限,如果在域环境下可以直接以域管理员身份登录系统获得远程关机的权限,一般在机房或网吧中都是工作组环境,无法直接获得远程关机的权限,怎么办呢?通过试验我找到了一个办法,具体步骤如下:
(1)在被控机上通过“计算机管理”建立一个用户,然后在“组策略”中给该用户配置远程关机权限,具体操作为:运行“gpedit.msc”打开“组策略编辑器”。在“组策略”左侧树窗口中依次打开“计算机配置”、“Windows 设置”、“安全设置”、“本地策略”、“用户权利指派”。在“组策略”右侧列表窗口选择“从远端系统强制关机”策略添加该用户。
|