Windows 中的使用者可以被授予各種權限特權
權限決定使用者帳戶可以執行的系統操作的類型。管理員為使用者和群組帳戶分配權限。每個使用者的權限包括授予該使用者和該使用者所屬群組的權限。
目前有35項特權。一些更有趣的是:
- SeSystemtime特權:需要修改系統時間。
- SeTimeZone特權:需要調整與電腦內部時鐘關聯的時區
- SeBackup權限:此權限使系統向任何檔案授予所有讀取存取控制權,無論為該檔案指定的存取控制清單 (ACL) 為何。
- Se建立頁面檔案權限:建立分頁檔案所需。
- Se遠端關閉權限:需要使用網路請求關閉系統。
- SeDebug權限:需要調試和調整另一個帳戶擁有的進程的記憶體。
但我感興趣的是:
- SeShutdown權限:需要關閉本機系統。
我注意到我實際上並沒有有這個特權。從提升的命令提示字元:
>whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
=============================== ========================================= ========
SeIncreaseQuotaPrivilege Adjust memory quotas for a process Disabled
SeSecurityPrivilege Manage auditing and security log Disabled
SeTakeOwnershipPrivilege Take ownership of files or other objects Disabled
...
SeShutdownPrivilege Shut down the system Disabled
...
使用時可以確認這一點流程瀏覽器檢查以我身分執行的提升進程的安全性令牌:
然而我能關閉系統。為什麼?
群組原則說我應該擁有它
如果您使用本機安全性原則編輯器管理單元 ( secpol.msc
),您可以看到我應該擁有特權:
這說明特權:
關閉系統
此安全性設定決定哪些本機登入電腦的使用者可以使用「關閉」命令關閉作業系統。濫用此使用者權限可能會導致拒絕服務。
工作站上的預設設定:管理員、備份操作員、使用者。
伺服器上的預設設定:管理員、備份操作員。
網域控制器上的預設設定:管理員、備份操作員、伺服器操作員、列印操作員。
我是一個使用者。有時我是一個行政人員,其他時候我是非管理員。
也許問題應該是為什麼不我有這個特權。
但現實是我沒有這個特權;然而,當本地登入時,我可以關閉本機系統。
為什麼?
@Mehrdad 有一個很好的答案,他刪除了,我認為值得關注,並且很好地簡潔地回答了這個問題:
你有特權。它只是預設為禁用。如果你當時沒有這個特權它根本不會被列出。
注意 這與缺少或SE_PRIVILEGE_REMOVED
不同 。SE_PRIVILEGE_ENABLED
SE_PRIVILEGE_ENABLED_BY_DEFAULT
獎勵閱讀
- 微軟軟體定義網路:特權常數
- 技術網:關閉系統-使用者權限分配
答案1
您已獲得許可,但這是殘障人士。這就是 PowerShell 告訴您的。
若要關閉系統,您可以使用名為的 Win32API 函數InitiateSystemShutdown
或者ExitWindowsEx
:
ExitWindowsEx(EWX_POWEROFF, 0);
這些函數注意:
要關閉本機計算機,請調用線必須具有 SE_SHUTDOWN_NAME 權限。預設情況下,使用者可以啟用 SE_SHUTDOWN_NAME管理員可以在遠端電腦上啟用 SE_REMOTE_SHUTDOWN_NAME 權限。
如您所見,Windows 檢查線特權(任何執行緒都有帶有特權的令牌)。如果您撥打電話ExitWindowsEx
時沒有SE_SHUTDOWN_NAME特權,該函數將失敗並出現錯誤:
Error code: 1314
A required privilege is not held by the client
預設情況下您建立的執行緒繼承您的權限;但是程式可以啟用已被授予的停用權限AdjustTokenPrivileges
:
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = LookupPrivilegeValue(NULL, "SeShutdownPrivilege");
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
HANDLE processToken = OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES);
AdjustTokenPrivileges(processToken, FALSE, &tp, 0, NULL, NULL);
CloseHandle(processToken);
更改令牌中的權限說:
AdjustTokenPrivileges
無法新增或刪除權限來自令牌。它可以僅啟用目前已停用的現有權限或停用目前啟用的現有權限
那麼,為什麼這個權限預設會被禁用呢?確保任何程式都不會意外關閉 Windows。應用程式應該明確要求這一點。
有一本古老但非常好的書:https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/關於所有這些事情。
答案2
這是因為您的使用者屬於啟用了該權限的群組。
要親自查看哪個組:
- 以管理員身分開啟 PowerShell(或命令)提示字元。
- 跑步
secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG
。 - 在記事本或類似工具中查看 OutFile.cfg 的內容,並尋找該
SeShutdownPrivilege
條目。您將(應該)看到啟用了該權限的使用者和/或群組的幾個/幾個 SID。
所以我列出了三個短 SID。短 SID 通常是電腦層級的帳戶/群組。例如,其中之一是S-1-5-32-545
.
使用 PowerShell 我們可以確定 SID 代表哪個帳戶/群組:
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-32-545")
$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
$objUser.Value
這樣就回來了BUILTIN\Users
。
由於您是該電腦上的用戶,因此您自動成為該群組的成員,這意味著您可以關閉電腦。
我的另外兩個是S-1-5-32-544
和S-1-5-32-551
。這些是標準BUILTIN\Administrators
組和BUILTIN\Backup Operators
組。它與您在對話方塊中看到的群組一致secpol.msc
。