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

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

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

是否有任何工具(免费软件,最好是)列出给定用户的所有NTFS权限? 我已经尝试从Sysinternals的AccessEnum,但列表不能被用户名筛选,对我来说是无用的。 我也看过CACLS,但据我可以告诉它显示文件的权限,而不是用户。

有任何想法吗?

这似乎有窍门(可能有一个警告),find用户“someuser”有权访问的所有文件夹,在本例中的C驱动器,使用内置的Windows icacls命令:

icacls c:\*. /findsid someuser /t /c /l 

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

*. 将被DOS老前辈认为是“寻找目录而不是文件”的方式。 当然,如果您想查找文件而不是文件夹,请将其更改为*.* ,当然,您可以将其指向任何驱动器,或者从任何文件夹运行,并保留驱动器/文件夹path并让其search仅相对于该文件夹。

我find了与OP相同的答案,并且find了这个条目,但是只看到一个基于可下载工具的报价而感到沮丧。 像其他人一样,我更喜欢使用内置的东西,我发现它在这个icacls工具中。

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

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

SIDfind:c:\ somedir \ somesubdir。

请注意,如果您以不具有某些正在遍历的目录的权限的用户身份运行此操作,则会在结果中交错执行错误,例如:

c:\系统卷信息:访问被拒绝。

而如果你可能正在search整个驱动​​器,那么可能会导致数百个这样的错误,从而很难在其中find结果。

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

现在,如果您有兴趣隐藏这些错误,您将无法使用find命令来pipe理只有成功的结果(那些涉及到“SID found”的结果),因为错误不会被过滤掉通过pipe道查找命令。 相反,如果要删除所有错误,则需要使用2>nul:来将错误stream(stderr)redirect到“位桶”。 所以上面的例子会变成:

 icacls c:\*. /findsid someuser /t /c /l 2>nul: 

只是要小心,一些产生这样的错误,哪些错误现在隐藏的文件夹,可能是名为“someuser”有权访问,但你不这样做的文件夹。 所以你可能要考虑简单地忽略这些错误。 但如果你想,那就是你如何做到的。

我意识到,这种可能性可能会限制这个答案的价值。 如果任何人对事物有更多的了解,想扩大或更正我的答案,我会欢迎的。

您可以使用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 } } } } 

它并不像PowerShell v3中可用的那么干净,但是它可以工作。 这将输出以string格式find的目录列表。

您可以轻松地将它们输出为对象,并继续处理它们(通过操作Write-In的input对象,将它们导出到CSV文件,删除条目,find信息等等)输出呼叫。

我find了解决我自己的问题。 我相信这是非常简单和干净的。 您只需安装subinacl并从命令提示符运行一行。

你可以在这里下载subinacl 。 尽pipe它仅在Win2k,XP和2k3上得到官方支持,但它也应该在Vista,2008和7上运行。

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

 subinacl /testmode /noverbose /outputlog=c:\TEXTFILENAME.TXT /subdirectories=directoriesonly X:\*.* /findsid=DOMAIN\username 

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

如果你使用switch / noverbose,你可以得到一个访问权限的简要列表 – 基本上你可以看到用户有权访问哪些目录(有时使用访问掩码和其他一些可能派上用场的东西)。

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

由于在父目录上经常启用inheritance,因此可能需要访问以调整权限的实际目录数量通常远远低于列表本身。