关机、重启、注销、休眠

关机,重启,注销和休眠这些操作都是一些高权限操作,如果一个进程的权限过低,执行这些操作会导致失败。因此,一个程序想要执行这些操作,首先需要以管理员权限运行它,其次是通过权限提升函数为程序获取关机的特权,步骤如下:

  1. 获取关机特权
  2. 执行关机操作

下面的代码用于开启关机特权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
HANDLE hToken = NULL;
HANDLE hProcess = GetCurrentProcess();
OpenProcessToken(hProcess,
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken);
TOKEN_PRIVILEGES tp = { 0 };
LookupPrivilegeValue(0,
SE_SHUTDOWN_NAME,
&tp.Privileges[0].Luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//调用函数提升权限
AdjustTokenPrivileges(hToken,
FALSE, &tp, sizeof(tp), NULL, NULL);

下面的代码用于关机等操作

1
2
3
4
5
6
7
8
9
关机:ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 
SHTDN_REASON_MINOR_OTHER);
重启:ExitWindowsEx(EWX_REBOOT | EWX_FORCE,
SHTDN_REASON_MINOR_OTHER);
注销:ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,
SHTDN_REASON_MINOR_OTHER);
休眠:SetSuspendState(TRUE, FALSE, FALSE);
睡眠:SetSuspendState(FALSE, FALSE, FALSE);
锁屏:LockWorkStation();