エグゼクティブサマリー:特定のユーザーまたはグループがアクセスできるすべてのディレクトリとファイルを検索したい。
詳細:DACLのACEに特定のユーザーまたはグループが含まれているすべてのファイルとディレクトリをNTFSディレクトリで再帰的に検索するコマンドラインツールを探しています。権限を変更したい場合は、subinaclまたはSetACLを使用します。これらのツールの1つを使用して検索と表示もできると思いましたが、簡単な解決策を見つけるのに苦労しています。
私は次のようにSetACLを使用できます:
setacl -on C:\SOME_DIR -ot file -actn list -lst "f:tab;w:d;i:y;" -rec cont
次に、関心のあるユーザーのgrepを実行しますが、よりエレガントなソリューションが必要です。私はおそらくここで何かが欠けています。何か案は?
ありがとう、「不明」。 PowerShellスクリプトは私には機能しませんが、機能するものを一緒にハッキングしました。私も初めてですが、試行錯誤を繰り返しました。
Get-ChildItem "C:\SOME\DIR" -recurse |
ForEach-Object {
$fname = $_.FullName
$acl = Get-Acl $fname
foreach ($e in $acl.Access) {
If ( -not $e.IsInherited -and
$e.AccessControlType -eq "Allow" -and
$e.IdentityReference -eq "SOMEDOMAIN\Somegroup")
{
Write-Host $fname
break
}
}
}
PowerShellカンフーを持っている人はおそらくこれを少しクリーンアップすることができます。アクセスがどこから始まるかを知りたいだけなので、継承されたエントリを無視することに注意してください。
テストされておらず、PowerShellには少し新しいですが、このようなものはそれを画面に書き込みます。そこから、ファイルなどにダンプできます。
Get-ChildItem "RootFolderPath" -recurse |
ForEach-Object {
$acl = Get-Acl $_.FullName
If $acl.ContainsKey "User/Group" {Write-Host $_.FullName}
}
ワンライナーですが、継承フィルターがないため、 'AccessToStringプロパティをチェックします。
Get-ChildItem "C:\SOME\DIR" -recurse|foreach{if((Get-Acl $_.FullName).AccessToString -like "*DOMAIN\username*"){write-Host $_.FullName}}
これが私が上から変更したPowerShellスクリプトで、私のために機能しました。
$files = @()
Get-ChildItem "d:\some\path" -recurse |
ForEach-Object {
$fname = $_.FullName
if ($fname -notlike "*_vti*") {
$acl = Get-Acl $($fname)
foreach ($e in $acl.Access) {
If ( $e.FileSystemRights -like "*Modify*" -and
$e.IdentityReference -eq "domain\user")
{
$files += $fname
break
}
}
}
}
$files > d:\out.txt
accessenum あなたのユースケースでうまくいくでしょうか?