gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:34:37 25 4
gpt4 key购买 nike

在我们使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com