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

Winapi 为什么我们需要在使用ExitWindowsEx之前添加SE_SHUTDOWN_NAME权限,winapi,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.Priv

在使用
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);
这个很好用

我知道这是出于设计,但我不明白微软决定在使用
ExitWindowsEx
功能之前必须启用特权的动机是什么。它显然不是为了阻止进程重新启动计算机而设计的,因为它重新启动所需要做的只是将SE_SHUTDOWN_名称添加到进程并调用
ExitWindowsEx

Windows开发术语可以将上面的代码直接放入
ExitWindowsEx
函数中。

您不需要添加它(您不能向当前令牌添加权限),您需要启用它

默认情况下,大多数权限都被禁用,可能是为了避免意外使用(就像文件上的只读属性一样)。没有必要在始终启用特权的情况下到处运行,让
ExitWindowsEx
函数本身启用它将破坏与其他特权相关函数的一致性。

您不需要添加它(您无法将特权添加到当前令牌),您需要启用它


默认情况下,大多数权限都被禁用,可能是为了避免意外使用(就像文件上的只读属性一样)。没有必要在始终启用特权的情况下到处运行,让
ExitWindowsEx
函数本身启用它将破坏与其他特权相关函数的一致性。

这是有道理的。在我接受你的答案(或者其他可能更好的答案)之前,我会等几天,以获得更多的答案。避免“意外使用”是正确的。如果特权未启用,则没有安全屏障,因为它可以轻松启用。因此,对于程序员来说,避免意外调用“系统”函数(通常是在没有阅读文档的情况下)更像是一种“便利”,这是有道理的。在我接受你的答案(或者其他可能更好的答案)之前,我会等几天,以获得更多的答案。避免“意外使用”是正确的。如果特权未启用,则没有安全屏障,因为它可以轻松启用。因此,对于程序员来说,避免意外调用“系统”函数更像是一种“便利”(通常是在没有阅读文档的情况下)。你误解了重点。您必须启用权限,因此,如果您没有此权限,您就不会关闭系统。@user2120666:不,我完全理解这一点,我知道必须启用权限,这是Microsoft文档中写的,顺便说一句,我上面的代码确实启用了所需的权限。再读一遍我的问题。问题是为什么微软决定在使用ExitWindowsEx之前必须启用“soome”特权。因为这是特权的关键所在。你误解了重点。您必须启用权限,因此,如果您没有此权限,您就不会关闭系统。@user2120666:不,我完全理解这一点,我知道必须启用权限,这是Microsoft文档中写的,顺便说一句,我上面的代码确实启用了所需的权限。再读一遍我的问题。问题是为什么微软决定在使用
ExitWindowsEx
之前必须启用“soome”特权,因为这是特权的关键所在。