Windowsのユーザーにはさまざまな権限が与えられます特権
権限によって、ユーザー アカウントが実行できるシステム操作の種類が決まります。管理者は、ユーザー アカウントとグループ アカウントに権限を割り当てます。各ユーザーの権限には、ユーザーとユーザーが所属するグループに付与される権限が含まれます。
現在、35 の権限があります。特に興味深いものは次のとおりです。
- SeSystemtime権限: システム時刻を変更するために必要です。
- タイムゾーン特権: コンピュータの内部時計に関連付けられたタイムゾーンを調整するために必要
- SeBackup権限: この権限により、システムは、ファイルに指定されたアクセス制御リスト (ACL) に関係なく、すべてのファイルに対する読み取りアクセス制御を許可します。
- SeCreatePagefile権限: ページング ファイルを作成するために必要です。
- SeRemoteShutdown権限: ネットワーク要求を使用してシステムをシャットダウンするために必要です。
- 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
ボーナス読書
- マイクロソフトDN:特権定数
- テクネット:システムのシャットダウン - ユーザー権利の割り当て
答え1
許可はありますが、無効PowerShell が伝えているのはこれです。
システムをシャットダウンするには、Win32API関数を使用します。InitiateSystemShutdown
またはExitWindowsEx
:
ExitWindowsEx(EWX_POWEROFF, 0);
これらの関数は次の点に注意します。
ローカルコンピュータをシャットダウンするには、糸SE_SHUTDOWN_NAME権限が必要です。デフォルトでは、ユーザーはSE_SHUTDOWN_NAMEを有効にすることができますログオンしているコンピュータ上で SE_REMOTE_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 がいくつか表示されます (表示されるはずです)。
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
。
あなたはそのコンピューターのユーザーなので、自動的にそのグループのメンバーとなり、コンピューターをシャットダウンできるようになります。
S-1-5-32-544
他には、 と がありますS-1-5-32-551
。これらは標準BUILTIN\Administrators
グループとBUILTIN\Backup Operators
グループです。これらは、ダイアログに表示されているグループと一致しますsecpol.msc
。