1 //关机函数
2 BOOL CShutdownDlg::SystemShutdown(void){
3 HANDLE hToken;
4 TOKEN_PRIVILEGES tkp;//设置访问特权变量
5 //OpenProcessToken 获取进程的访问令牌
6 if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
7 {
8 MessageBox("获取访问令牌失败!");
9 return FALSE;
10 }
11 // LookupPrivilegeValue查看系统的特权值
12 LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
13 tkp.PrivilegeCount = 1; // 指定特权数组个数1
14 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;//启用特权
15 // AdjustTokenPrivileges的作用是通知Windows NT修改本进程的权利
16 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);//启用当前访问令牌的特权
17 if (GetLastError() != ERROR_SUCCESS) //失败
18 {
19 MessageBox("获取权限失败!");
20 return FALSE;
21 }
22 if (!ExitWindowsEx(EWX_SHUTDOWN, 0)) //参数在这里设置。EWX_SHUTDOWN 为正常关机,强行退出为WINDOWSEWX_FORCE。
23 return FALSE;
24 return TRUE;
25 }