执行摘要:我想找到特定用户或组有权访问的所有目录和文件。
更详细地说:我正在寻找一个命令行工具,用于递归搜索 NTFS 目录中所有文件和目录,其中 DACL 中的 ACE 包含给定用户或组。如果我想修改权限,我会使用亚蛋白或者设置ACL。我以为我也可以使用其中一种工具来搜索和显示,但我找不到直接的解决方案。
我可以像这样使用 SetACL:
setacl -on C:\SOME_DIR -ot file -actn list -lst "f:tab;w:d;i:y;" -rec cont
然后 grep 查找感兴趣的用户,但我想要一个更优雅的解决方案。我可能在这里遗漏了一些东西。有什么想法吗?
答案1
谢谢,“未知”。您的 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 功夫的人可能可以稍微清理一下。请注意,我让它忽略继承的条目,因为我只想知道访问从哪里开始。
答案2
未经测试,对 powershell 有点陌生,但像这样的东西会将其写入屏幕。从那里你可以将其转储到文件或其他地方。
Get-ChildItem "RootFolderPath" -recurse |
ForEach-Object {
$acl = Get-Acl $_.FullName
If $acl.ContainsKey "User/Group" {Write-Host $_.FullName}
}
答案3
单行,但没有继承过滤器,因为它检查 AccessToString 属性。
Get-ChildItem "C:\SOME\DIR" -recurse|foreach{if((Get-Acl $_.FullName).AccessToString -like "*DOMAIN\username*"){write-host $_.FullName}}
答案4
下面是我根据上面内容修改的、对我有用的 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