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

Jab*_*cky 1 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);
Run Code Online (Sandbox Code Playgroud)

这完全没问题.

我知道这是设计的,但我不明白微软在使用该ExitWindowsEx功能之前决定必须启用特权的动机是什么.它显然不是为防止进程重新启动计算机而设计的,因为重新启动它需要做的就是将SE_SHUTDOWN_NAME添加到进程并调用ExitWindowsEx.

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

Med*_*noc 10

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

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

  • 避免"意外使用"是正确的.如果没有启用权限,则没有安全屏障,因为它可以轻松启用.因此,它更像是程序员避免意外调用"系统"功能的"便利"(通常如果没有读过文档). (2认同)