Windowsのユーザーには、さまざまな 特権 を付与できます
特権は、ユーザーアカウントが実行できるシステム操作のタイプを決定します。管理者は、ユーザーおよびグループアカウントに特権を割り当てます。各ユーザーの権限には、ユーザーおよびユーザーが属するグループに付与された権限が含まれます。
現在35の特権があります。より興味深いもののいくつかは:
しかし、私が興味を持っているのは:
私は実際には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を使用して、自分として実行されている昇格されたプロセスのセキュリティトークンを調べるときに確認されます。
それでも、システムをシャットダウンできます。どうして?
ローカルセキュリティポリシーエディタースナップイン(secpol.msc
)を使用する場合、私が特権を持っている必要があることがわかります。
特権の説明:
システムをシャットダウンする
このセキュリティ設定は、コンピュータにローカルでログオンしているユーザーが、[シャットダウン]コマンドを使用してオペレーティングシステムをシャットダウンできるかどうかを決定します。このユーザー権利を誤用すると、サービス拒否が発生する可能性があります。
ワークステーションのデフォルト:管理者、バックアップオペレーター、ユーザー。
サーバーのデフォルト:管理者、バックアップオペレーター。
ドメインコントローラーのデフォルト:管理者、バックアップオペレーター、サーバーオペレーター、印刷オペレーター。
私はserです。 Administratorになることもあれば、-NotAdministratorになることもあります。
たぶん問題はなぜでしょうしないでください私には特権があります。
しかし、実際には私には特権がありません。ローカルにログインすると、ローカルシステムをシャットダウンできます。
どうして?
@Mehrdadには良い答えがあり、彼はそれを削除しました。これは注意に値するものであり、質問にきちんと簡潔に答えます。
あなた持っている特権。デフォルトでは無効になっています。あなたが特権を持っていなかったなら、それはまったくリストされないだろう。
通知SE_PRIVILEGE_REMOVED
は、SE_PRIVILEGE_ENABLED
またはSE_PRIVILEGE_ENABLED_BY_DEFAULT
がない場合とは異なります。
権限はありますが、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/ すべてのものについて。
これは、ユーザーがその特権が有効になっているグループに属しているためです。
自分のグループを確認するには:
secedit /export /areas USER_RIGHTS /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
ダイアログに表示されるグループと一致します。