列出用户的文件夹访问权限

ima*_*dei 16 windows permissions ntfs users

我有一个域中的用户可以访问多个文件夹中的多个子文件夹。他的权利被非常细致地定义。现在他将离开公司,但将继续作为合同资源为一家公司工作。

我需要找到他有权访问的所有文件夹并撤销他的权限,然后为他设置一组不同的访问权限。

是否有任何工具(最好是免费软件)列出给定用户的所有 NTFS 权限?我已经尝试过使用 Sysinternals 的 AccessEnum,但该列表无法按用户名过滤,对我来说毫无用处。我也看过 CACLS,但据我所知,它显示按文件排序的权限,而不是按用户排序。

有任何想法吗?

cha*_*art 15

这似乎可以解决问题(可能有一个警告),使用内置的 Windows icacls 命令查找用户“someuser”有权访问的所有文件夹,在此示例中位于 C 驱动器上:

icacls c:\*. /findsid someuser /t /c /l
Run Code Online (Sandbox Code Playgroud)

/t 需要告诉它递归目录。需要 /c 来告诉它即使遇到错误也继续前进。/l 使其与符号链接(如果有)一起使用。(最后一个是 L,这些标志可以是大写或小写。)

*.将被 DOS 老手们认为是“寻找目录,而不是文件”的方式。当然,如果您确实想查找文件而不是文件夹,请将其更改*.*为仅文件夹。

我寻求与 OP 相同的答案,并找到了这个条目,但我很沮丧地只看到基于可下载工具的报价。和其他人一样,我更喜欢使用内置的东西,我在这个 icacls 工具中找到了它。

我已经确认它可以在 Windows Server 2012、2008 和 Windows 7 上运行,所以我怀疑它在 Server 2003、Windows 8 等中也可以运行。

结果列表将是一行一行显示的文件夹,例如:

找到 SID:c:\somedir\somesubdir。

请注意,如果您以本身没有访问某些目录权限的用户身份运行此程序,您将在结果中交错出现错误,例如:

c:\System Volume Information: 访问被拒绝。

如果您可能正在搜索整个驱动​​器,则可能会导致数百个此类错误,从而很难在其中找到结果。

有些人可能认为答案是以管理员身份运行命令行,但这只会导致出现更多此类错误,因为您现在将遍历以前隐藏的文件夹。

现在,如果您有兴趣隐藏这些错误,您将无法使用 find 命令仅通过管道传输成功的结果(那些引用“SID found”的结果),因为错误不会被过滤掉通过管道到 find 命令。相反,如果您想删除所有错误,您需要使用相当晦涩的技巧,通过使用2>nul:. 所以上面的例子会变成:

icacls c:\*. /findsid someuser /t /c /l 2>nul:
Run Code Online (Sandbox Code Playgroud)

请注意,某些生成此类错误的文件夹(现在隐藏了这些错误)很可能是名为“someuser”的文件夹可以访问但您没有访问权限。因此,您可能要三思而后行,忽略这些错误。但如果你愿意,这就是你可以做到的。

我意识到,这种可能性确实可能会限制这个答案的价值。如果任何对事物更熟悉的人想要扩展或更正我的答案,我会欢迎它。


小智 7

您可以使用 PowerShell 而无需下载任何其他内容。这将适用于 v2.0 及更高版本:

$ReferenceAccountName = 'DOMAIN\Username'
[string[]]$SearchDirectories = @('X:\SomeDirectory', 'F:\AnotherDirectory')

foreach ($RootDir in $SearchDirectories) {
    $DirACL = Get-Acl -Path $RootDir
    foreach ($ACL in $DirACL.Access){
        if ($ACL.IdentityReference -like $ReferenceAccountName){
            Write-Output $RootDir
        }
    }
    foreach ($Directory in (Get-ChildItem -Path $RootDir -Recurse | `
                            Where-Object -FilterScript {$_.Attributes `
                            -contains 'Directory'})){
        $DirACL = Get-Acl -Path $Directory.FullName
        foreach ($ACL in $DirACL.Access){
            if ($ACL.IdentityReference -like $ReferenceAccountName){
                Write-Output $Directory.FullName
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它不像 PowerShell v3 及更高版本中可用的那样干净,但它可以工作。这将输出以字符串格式找到的目录列表。

您可以轻松地将它们作为对象输出并继续使用它们(将它们导出到 CSV 文件,在找到它们时删除条目,使用信息更新票证......等)通过操作 Write-输出调用。

  • 是的,您可以:`if ($ACL.IdentityReference -like $ReferenceAccountName -and !$ACL.IsInherited){` (2认同)

ima*_*dei 4

我找到了自己问题的解决方案。我相信,它非常简单、干净。您只需安装 subinacl 并从命令提示符运行一行即可。

您可以在这里下载 subinacl。虽然它仅在 Windows 2000、Windows XP 和 Windows Server 2003 上得到正式支持,但它也应该可以在 Windows Vista、Windows Server 2008 和 Windows 7 上运行。

接下来,从命令提示符运行以下命令:

subinacl /testmode /noverbose /outputlog=c:\TEXTFILENAME.TXT /subdirectories=directoriesonly X:\*.* /findsid=DOMAIN\username
Run Code Online (Sandbox Code Playgroud)

其中X:是您正在扫描的驱动器,用户名是您要列出其权限的用户。扫描可能需要一些时间,您会在 TEXTFILENAME.TXT 中得到结果。

如果您使用开关/noverbose,您将获得一个紧凑的访问权限列表 - 基本上您可以看到用户有权访问哪些目录(带有访问掩码和其他一些有时可能会派上用场的东西)。

我使用 OpenOffice Calc导入列表,然后应用自定义过滤器并仅过滤以+FILE开头的行。这些行包含用户有权访问的目录。这就是如何使用简单的工具最终只获得相关信息。

由于继承通常在父目录上启用,因此您可能需要访问以调整权限的实际目录数通常明显低于列表本身。