为什么我们需要在使用ExitWindowsEx之前添加SE_SHUTDOWN_NAME权限

时间:2014-03-25 12:26:46

标签: winapi

在我们使用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函数。

1 个答案:

答案 0 :(得分:9)

您不需要添加它(您无法为当前令牌添加权限),您需要启用它。

默认情况下禁用大多数权限,可能是为了避免意外使用(就像文件上的只读属性一样)。没有必要随时启用权限,并且让ExitWindowsEx函数单独启用它会破坏与其他特权相关函数的一致性。