在我们使用 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
函数中。
最佳答案
您不需要添加它(您不能为您当前的 token 添加权限),您需要启用它。
大多数权限在默认情况下是禁用的,可能是为了避免意外使用(就像文件的只读属性一样)。无需一直在启用特权的情况下到处跑,让 ExitWindowsEx
函数本身启用它会破坏与其他依赖特权的函数的一致性。
关于winapi - 为什么我们在使用ExitWindowsEx之前需要添加SE_SHUTDOWN_NAME权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22634582/