web-dev-qa-db-ja.com

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

Windowsのユーザーには、さまざまな 特権 を付与できます

特権は、ユーザーアカウントが実行できるシステム操作のタイプを決定します。管理者は、ユーザーおよびグループアカウントに特権を割り当てます。各ユーザーの権限には、ユーザーおよびユーザーが属するグループに付与された権限が含まれます。

現在35の特権があります。より興味深いもののいくつかは:

  • SeSystemtimePrivilege:システム時刻を変更するために必要です。
  • SeTimeZonePrivilege:コンピュータの内部時計に関連付けられているタイムゾーンを調整するために必要
  • SeBackupPrivilege:この権限により、ファイルに指定されているアクセス制御リスト(ACL)に関係なく、システムはすべての読み取りアクセス制御を任意のファイルに許可します。
  • SeCreatePagefilePrivilege:ページングファイルを作成するために必要です。
  • SeRemoteShutdownPrivilege:ネットワーク要求を使用してシステムをシャットダウンするために必要です。
  • SeDebugPrivilege:別のアカウントが所有するプロセスのメモリをデバッグおよび調整するために必要です。

しかし、私が興味を持っているのは:

  • SeShutdownPrivilege:ローカルシステムをシャットダウンするために必要です。

私は実際にはhaveこの特権を持っていないことに気付きました。管理者特権のコマンドプロンプトから:

>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

特権の説明

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

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

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

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

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

私はserです。 Administratorになることもあれば、-NotAdministratorになることもあります。

たぶん問題はなぜでしょうしないでください私には特権があります。

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

どうして?


@Mehrdadには良い答えがあり、彼はそれを削除しました。これは注意に値するものであり、質問にきちんと簡潔に答えます。

あなた持っている特権。デフォルトでは無効になっています。あなたが特権を持っていなかったなら、それはまったくリストされないだろう
通知SE_PRIVILEGE_REMOVEDは、SE_PRIVILEGE_ENABLEDまたはSE_PRIVILEGE_ENABLED_BY_DEFAULTがない場合とは異なります。

ボーナスリーディング

21
Ian Boyd

権限はありますが、disabledです。 PowerShellがそれを伝えています。

システムをシャットダウンするには、Win32API関数 InitiateSystemShutdown または ExitWindowsEx を使用します。

ExitWindowsEx(EWX_POWEROFF, 0);

これらの関数は次のことに注意してください。

ローカルコンピュータをシャットダウンするには、呼び出し側のthreadにSE_SHUTDOWN_NAME特権が必要です。デフォルトでは、ユーザーはログオンしているコンピューターでSE_SHUTDOWN_NAME特権を有効にでき、管理者はリモートコンピューターでSE_REMOTE_SHUTDOWN_NAME特権を有効にできます。

ご覧のとおり、Windowsはthread特権をチェックします(どのスレッドにも特権を持つトークンがあります)。 SE_SHUTDOWN_NAME特権なしでExitWindowsExを呼び出すと、関数は次のエラーで失敗します。

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/ すべてのものについて。

30
user996142

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

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

  • 管理者として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-544S-1-5-32-551です。これらは、標準のBUILTIN\AdministratorsグループとBUILTIN\Backup Operatorsグループです。 secpol.mscダイアログに表示されるグループと一致します。

5