2014-03-25 189 views
-1

之前添加SE_SHUTDOWN_NAME特权之前,我们可以使用关闭计算机的ExitWindowsEx功能,我们必须SE_SHUTDOWN_NAME特权添加到过程是这样的:为什么我们需要使用ExitWindowsEx

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_NAME添加到进程并调用ExitWindowsEx

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

+0

-1。你误解了整个观点。你必须启用权限,所以如果你没有这个权限,你不会关闭系统。 – user2120666

+0

@ user2120666:不,我完全理解了整点,我知道必须启用该特权,这是在微软文档中写的BTW,并且我的代码如上所述**会启用所需的特权。再次阅读我的问题。问题在于,为什么微软决定在使用ExitWindowsEx之前必须启用soome特权。 –

+0

因为这是完整的特权。 – user2120666

回答

8

你不需要添加它(你不能添加一个特权到你当前的标记),你需要启用它。

默认情况下,大多数特权都是禁用的,可能会避免意外使用(就像文件的只读属性一样)。没有必要随时启用权限,并且让ExitWindowsEx函数自己启用它会破坏与其他权限相关的函数的一致性。

+0

这很有道理。在我接受你的答案(或者另一个更好的答案)之前,我会等上几天才能得到更多答案。 –

+2

避免“意外使用”是正确的。如果由于可以轻松启用而没有启用特权,则不构成安全障碍。所以它更像是程序员避免无意中调用“系统”函数(通常如果没有阅读文档)的“便利”。 – ChristianWimmer