
管理者グループ (sid: S-1-5-32-544) のみがファイルまたはフォルダーの所有権を取得する権限 (SeTakeOwnershipPrivilege) を持っていることを確認する必要があります。
この権限を持つすべてのユーザー/グループの概要を取得するにはどうすればよいですか?
私がすでに見つけて試したのは次のコマンドです:
secedit /export /areas USER_RIGHTS /cfg output.txt
ファイル内の出力は非常に便利そうです:
[Unicode]
Unicode=yes
[特権権限]
SeNetworkLogonRight = *S-1-5-32-544
...
SeTakeOwnershipPrivilege = *S-1-5-32-544
...
[バージョン]
signature="$CHICAGO$"
Revision=1
上記の方法では、ファイルを Powershell スクリプトに読み込み、権限を検索し、その後ファイルを削除する必要があります。
外部モジュールや実行可能ファイルを使用せずに、Powershell でこれを行う他の方法はありますか?
ご提供ありがとうございます。
乾杯
デビッド
答え1
別の方法としては、LsaEnumerateAccountsWithUserRightWin32 API関数。これはC#でコーディングする必要があります(PInvoke) をスクリプト内に含めると、コード定義が非常に長くなり、乱雑になります。
私は上記を避け、代わりに実行可能ファイルをラップします。なぜ車輪の再発明をするのでしょうか?
# Check this priviledge.
$privilege = 'SeDenyInteractiveLogonRight'
# Create temp file for executable output.
$tempFile = [System.IO.Path]::GetTempFileName()
# Run the executable and wait for it to finish.
Start-Process -FilePath secedit.exe -ArgumentList "/export /areas USER_RIGHTS /cfg $tempFile" -Wait -WindowStyle Hidden
# Run through lines in the output file.
Get-Content $tempFile -Encoding Unicode | Where-Object {
# Where the privilege is listed.
$_ -match $privilege } | ForEach-Object {
# Seperate the key and values.
$_.split('=')[1].split(',') | ForEach-Object {
# Ouput the user/SID values
$_.trim()
}
}
答え2
純粋な PS ソリューションではありませんが、それでも選択肢の 1 つです。:)
MicrosoftのAccessChkユーティリティ(ここからダウンロードSecEdit の代わりに ) を使用します。
SecEdit とは異なり、AccessChk は stdout に出力するため、その出力を PS 変数に簡単にキャプチャし、その変数をチェックできます (中間ファイルは必要ありません)。
何かのようなもの:
$privToCheckFor = "SeTakeOwnershipPrivilege"
$groupPrivs = .\accesschk -a administrators *
if ((Out-String -InputObject $groupPrivs).IndexOf($privToCheckFor) -ge 0) {
Write-Host "Has Privilege"
} else {
Write-Host "Doesn't Have Privilege"
}
答え3
答え4
解決策は次のとおりです:
(Get-WmiObject -Namespace root\rsop\computer -Class RSOP_UserPrivilegeRight | Where-Object {$_.UserRight -eq "SeTakeOwnershipPrivilege"}).AccountList