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

标签 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 函数中。

最佳答案

您不需要添加它(您不能为您当前的 token 添加权限),您需要启用它。

大多数权限在默认情况下是禁用的,可能是为了避免意外使用(就像文件的只读属性一样)。无需一直在启用特权的情况下到处跑,让 ExitWindowsEx 函数本身启用它会破坏与其他依赖特权的函数的一致性。

关于winapi - 为什么我们在使用ExitWindowsEx之前需要添加SE_SHUTDOWN_NAME权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22634582/

相关文章:

windows - 为什么较新的 Windows 版本仍支持某些旧的 Win16 API?

c# - 以编程方式启用/禁用设备的 Win32 API 函数

c++ - 在 C++ 中以编程方式从 DLL 中获取 DLL 版本 - 再次

c++ - 提取证书中主题属性的所有值

windows - 有什么办法可以得到 future 点的 UTC 时间转换?

cocoa - 混合 Carbon 和 Cocoa 那么其他平台呢?

c - 在 ANSI C 中使用 WinAPI 和 DWMApi

winapi - 如何阻止 Excel 工作簿在自动化打开时闪烁?

c - WinApi 基础服务教程?

c++ - 如何获取 EFI 系统分区的卷名?