我在域中有一个用户,可以访问多个文件夹中的多个子文件夹。他的权利定义得很细致。现在他离开公司,但将继续作为合同资源为一家公司工作。
我需要找到他有权访问的所有文件夹并撤消他的权限,然后为他设置另一组访问权限。
是否有列出给定用户的所有NTFS权限的工具(最好是免费软件)?我已经尝试过使用Sysinternals的AccessEnum,但是该列表无法按用户名过滤,对我来说毫无用处。我也看过CACLS,但据我所知,它显示的是按文件而不是用户排序的权限。
有任何想法吗?
我在域中有一个用户,可以访问多个文件夹中的多个子文件夹。他的权利定义得很细致。现在他离开公司,但将继续作为合同资源为一家公司工作。
我需要找到他有权访问的所有文件夹并撤消他的权限,然后为他设置另一组访问权限。
是否有列出给定用户的所有NTFS权限的工具(最好是免费软件)?我已经尝试过使用Sysinternals的AccessEnum,但是该列表无法按用户名过滤,对我来说毫无用处。我也看过CACLS,但据我所知,它显示的是按文件而不是用户排序的权限。
有任何想法吗?
Answers:
这似乎可以解决问题(可能需要警告),使用内置的Windows icacls命令在C驱动器上查找用户“ someuser”可以访问的所有文件夹:
icacls c:\*. /findsid someuser /t /c /l
需要/ 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”的结果),因为错误不会被滤除通过管道找到命令。相反,如果要删除所有错误,则需要使用相当晦涩的技巧,通过使用将错误流(stderr)重定向到“位存储桶” 2>nul:
。因此,上面的示例将变为:
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及更高版本所提供的那样干净,但是可以正常工作。这将输出以字符串格式找到的目录列表。
您可以通过操作Write-输出呼叫。
if ($ACL.IdentityReference -like $ReferenceAccountName -and !$ACL.IsInherited){
我找到了自己的问题的解决方案。我相信这是非常简单和干净的。您只需要安装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
其中X:是您要扫描的驱动器,用户名是您要列出其权限的用户。扫描可能需要一些时间,并且您会在TEXTFILENAME.TXT中得到结果。
如果使用开关/ noverbose,则会获得访问权限的简要列表-基本上,您会看到用户有权访问的目录(带有访问掩码和某些其他有时可能会派上用场的东西)。
我使用OpenOffice Calc导入列表,然后应用自定义过滤器,仅对以+ FILE开头的行进行过滤。这些行包含用户有权访问的目录。这就是使用简单工具最终仅获得相关信息的方式。
由于通常在父目录上启用继承,因此您可能需要访问以调整权限的目录的实际数量通常大大低于列表本身。