SeShutdownPrivilegeがないときにシステムをシャットダウンするにはどうすればよいですか


20

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を使用して、私として実行されている昇格されたプロセスのセキュリティトークンを調べるときに確認されます。

ここに画像の説明を入力してください

それでもシステムをシャットダウンできます。どうして?

グループポリシーには、私はそれがあるべきだと書かれています

ローカルセキュリティポリシーエディタースナップイン(secpol.msc)を使用している場合、次の特権が必要であることがわかります。

  • secpol.msc

    • セキュリティ設定
    • ローカルポリシー
    • ユーザー権利の割り当て
    • システムをシャットダウンします

      ここに画像の説明を入力してください

特権の説明

システムをシャットダウンします

このセキュリティ設定は、コンピューターにローカルでログオンしているユーザーのうち、シャットダウンコマンドを使用してオペレーティングシステムをシャットダウンできるユーザーを決定します。このユーザー権利を悪用すると、サービス拒否が発生する可能性があります。

ワークステーションのデフォルト:管理者、バックアップオペレーター、ユーザー。

サーバーのデフォルト:管理者、バックアップオペレーター。

ドメインコントローラーのデフォルト:管理者、バックアップオペレーター、サーバーオペレーター、プリントオペレーター。

私はユーザーです。時々私は管理者であり、他の時はNotAdministratorです。

おそらく、私に特権がないのはなぜだろうか。

しかし現実には、私には特権がありません。それでもローカルにログインすると、ローカルシステムをシャットダウンできます。

どうして?


@Mehrdadは良い答えを持っていた、彼は削除した、私は注意に値し、質問にきちんと簡潔に答えると思う:

あなたは特権があります。デフォルトでは無効になっています。あなたに特権がなかったなら、それは全くリストされないでしょう。またはが欠け ているとは異なる ことに
注意しくださいSE_PRIVILEGE_REMOVEDSE_PRIVILEGE_ENABLEDSE_PRIVILEGE_ENABLED_BY_DEFAULT

ボーナスリーディング


ドメインによって処理されるグループポリシーは、ローカルグループポリシーをオーバーライドします。ローカル許可の代わりにドメイン許可を調整します。?あなたはwhoamiを/ PRIV :,何ユーザーグループ」、走ったとき、私は完全にあなたが求めているものを理解していない場合、私は唯一のあなたが求めているもの野生の推測を取っていますので、あなたは、に編集あなたの質問でした。
Ramhound

セキュリティトークンに特権がないときにシステムをシャットダウンできる理由を尋ねています。特権がローカルマシンからのものかドメインコントローラーからのものか:どちらにしても、私はそれを持っていません。
イアン・ボイド

電源プラグが...すべての権限の問題を回避しています:)もちろん削除すると、それは...再起動する方法によって異なります
太陽マイク

回答:


29

許可はありますが、無効になっています。PowerShellがあなたに言っていることです。

システムをシャットダウンするには、InitiateSystemShutdownまたはと呼ばれるWin32API関数を使用します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/はすべてのものについて。


私は実際に数年前にその本を買いました。もう一度読み直さなければなりません。
イアン・ボイド

Cを知っている場合は、VSコミュニティ(無料)をダウンロードし、privを使用してプログラムでPCをシャットダウンしてみてください。次に、このprivをプログラムで有効にして、再試行してください。それはWindowsについて何でも研究する最良の方法です:)
user996142

@ user996142-何を、シャットダウンすることで?あなたが正しいと思います。:)
ジュール

5

ユーザーが、その特権が有効になっているグループに属しているためです。

自分のグループを確認するには:

  • 管理者としてPowerShell(またはコマンド)プロンプトを開きます。
  • を実行しますsecedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG
  • OutFile.cfgの内容をメモ帳などで表示し、SeShutdownPrivilegeエントリを探します。その特権が有効になっているユーザーまたはグループ、あるいはその両方のSIDが表示されます(または表示されるはずです)。

したがって、3つの短いSIDがリストされています。短いSIDは通常、コンピューターレベルのアカウント/グループです。たとえば、そのうちの1つはです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

あなたはそのコンピューターのユーザーなので、自動的にそのグループのメンバーになります。つまり、コンピューターをシャットダウンできます。

私が持っている他の2つはS-1-5-32-544、とS-1-5-32-551です。これらは、標準BUILTIN\AdministratorsグループとBUILTIN\Backup Operatorsグループです。secpol.mscダイアログに表示されているグループと一致するもの。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.