查找 NTFS 中具有特定用户或组的 ACL 中的所有文件

查找 NTFS 中具有特定用户或组的 ACL 中的所有文件

执行摘要:我想找到特定用户或组有权访问的所有目录和文件。

更详细地说:我正在寻找一个命令行工具,用于递归搜索 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

相关内容