在我们使用ExitWindowsEx
函数关闭计算机之前,我们必须为此过程添加SE_SHUTDOWN_NAME
权限:
HANDLE hToken = NULL;
LUID luid;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
LookupPrivilegeValue(L"", SE_SHUTDOWN_NAME, &luid);
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bRet = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, 0);
ExitWindowsEx(EWX_REBOOT, 0);
这完全没问题。
我知道这是设计的,但我不明白Microsoft在决定是否必须启用权限才能使用ExitWindowsEx
功能之前的动机是什么。它显然不是为了阻止进程重新启动计算机而设计的,因为重新启动它需要做的就是将SE_SHUTDOWN_NAME添加到进程并调用ExitWindowsEx
。
Windows开发术语可以将上面的代码直接放入ExitWindowsEx
函数。
答案 0 :(得分:9)
您不需要添加它(您无法为当前令牌添加权限),您需要启用它。
默认情况下禁用大多数权限,可能是为了避免意外使用(就像文件上的只读属性一样)。没有必要随时启用权限,并且让ExitWindowsEx
函数单独启用它会破坏与其他特权相关函数的一致性。