2014-03-25 188 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