在我们使用该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功能单独启用会破坏与其他权限相关的功能的一致性.
| 归档时间: |
|
| 查看次数: |
1317 次 |
| 最近记录: |