題 當我沒有SeShutdownPrivilege時,如何關閉系統


Windows中的用戶可以被授予各種權限 特權

權限確定用戶帳戶可以執行的系統操作的類型。管理員為用戶和組帳戶分配權限。每個用戶的權限包括授予用戶和用戶所屬組的權限。

目前有35個特權。一些更有趣的是:

  • SeSystemtimePrivilege:需要修改系統時間。
  • SeTimeZonePrivilege:需要調整與計算機內部時鐘關聯的時區
  • SeBackupPrivilege:此權限使系統將所有讀取訪問控制授予任何文件,而不管為文件指定的訪問控制列表(ACL)。
  • SeCreatePagefilePrivilege:創建頁面文件時需要。
  • SeRemoteShutdownPrivilege:需要使用網絡請求關閉系統。
  • SeDebugPrivilege:需要調試和調整其他帳戶擁有的進程的內存。

但我感興趣的是:

  • SeShutdownPrivilege:需要關閉本地系統。

我注意到我實際上並沒有  這個特權。從提升的命令提示符:

>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
   ...

這在使用時得到確認 Process Explorer 檢查以我身份運行的提升進程的安全性令牌:

enter image description here

但是我 能夠 關閉系統。為什麼?

集團政策說我應該擁有它

如果您使用本地安全策略編輯器管理單元(secpol.msc),你可以看到我 應該 有特權:

  • secpol.msc

    • 安全設定
    • 地方政策
    • 用戶權利分配
    • 關閉系統

      enter image description here

 特權:

關閉系統

此安全設置確定本地登錄的用戶   到計算機可以使用關機關閉操作系統   命令。濫用此用戶權限可能導致拒絕服務。

工作站上的默認值:管理員,備份操作員,用戶。

服務器上的默認值:管理員,備份操作員。

域控制器上的默認值:管理員,備份操作員,   服務器操作員,打印操作員。

我是一個 用戶。有時我是一個 管理員,有時我也是 NotAdministrator

也許這個問題應該是原因  我有這個特權。

但現實是我沒有這種特權;然而,當本地登錄時,我可以關閉本地系統。

為什麼?


@Mehrdad得到了一個很好的答案,他刪除了,我認為值得關注,並且很好地和簡潔地回答了這個問題:

 特權。它只是默認禁用。如果你   那時沒有特權 它根本不會列出
注意   那 SE_PRIVILEGE_REMOVED 不同於缺乏    SE_PRIVILEGE_ENABLED 要么 SE_PRIVILEGE_ENABLED_BY_DEFAULT

獎金閱讀


20
2017-09-27 20:14


起源


域處理的組策略將覆蓋您的本地組策略。調整域權限而不是本地權限。當你跑步時,“whoami / priv:,你在哪個用戶組?如果我完全不明白你在問什麼,請編輯你的問題,因為我只是猜測你在問什麼。 - Ramhound
我問為什麼當我的安全令牌沒有權限時我能夠關閉系統。權限是來自本地計算機還是域控制器:無論哪種方式我都沒有。 - Ian Boyd
刪除電源插頭可以解決所有權限問題... :)當然取決於它如何重新啟動... - Solar Mike


答案:


你有權限,但確實如此 。這就是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/ 關於所有這些東西。


29
2017-09-27 21:05



幾年前我真的買了那本書;我將不得不重新閱讀。 - Ian Boyd
如果你知道C,你可以下載VS社區(這是免費的)並嘗試以私有方式以編程方式關閉PC。然後,以編程方式啟用此priv並再次嘗試)。這是研究Windows的最佳方式:) - user996142
@ user996142 - 什麼,關閉它?猜猜你是對的。 :) - Jules


這是因為您的用戶屬於啟用了該權限的組。

要親自了解哪個群組:

  • 以Admin身份打開PowerShell(或Command)提示符。
  • 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 對話。


5
2017-09-27 21:16