我有一个域中的用户,他有权访问多个文件夹中的多个子文件夹。他的权限定义得非常细化。现在他要离开公司了,但会继续以合同资源的身份为一家公司工作。
我需要找到他有权访问的所有文件夹并撤销他的权限,然后为他设置一组不同的访问权限。
是否有任何工具(最好是免费软件)可以列出给定用户的所有 NTFS 权限?我尝试使用 Sysinternals 的 AccessEnum,但列表无法按用户名过滤,对我来说毫无用处。我也查看了 CACLS,但据我所知,它按文件而不是按用户排序显示权限。
有任何想法吗?
答案1
这似乎可以解决问题(但可能有一个警告),找到用户“someuser”有权访问的所有文件夹,在此示例中为 C 盘,使用内置的 Windows icacls 命令:
icacls c:\*. /findsid someuser /t /c /l
/t 是指示它递归目录所必需的。/c 是指示它即使遇到错误也要继续运行所必需的。/l 使它能够处理符号链接(如果有)。(最后一个是 L,这些标志可以是大写或小写。)
*.
DOS 老手会认为 是“查找目录,而不是文件”的意思。当然,如果您确实想查找文件而不是文件夹,请将其更改为,*.*
当然您可以将其指向任何驱动器,或从任何文件夹运行它,并忽略驱动器/文件夹路径,让它仅相对于该文件夹进行搜索。
我寻求与原帖相同的答案,并找到了此条目,但很遗憾只看到基于可下载工具的提议。与其他人一样,我更喜欢使用内置功能,我在此 icacls 工具中找到了它。
我已经确认它可以在 Windows Server 2012、2008 和 Windows 7 上运行,所以我认为它也可以运行在 Server 2003、Windows 8 等系统中。
生成的列表将是逐行显示的文件夹,例如:
找到 SID:c:\somedir\somesubdir。
请注意,如果您以没有权限访问某些目录的用户身份运行此程序,您将在结果中遇到如下错误:
c:\System 卷信息:访问被拒绝。
如果您搜索整个驱动器,则可能会导致数百个此类错误,从而很难在其中找到结果。
有些人可能认为答案是以管理员身份运行命令行,但这只会导致出现更多此类错误,因为您现在将遍历以前隐藏的文件夹。
现在,如果您想要隐藏这些错误,您将无法使用 find 命令仅将成功的结果(确实引用“SID found”)通过管道传输出去,因为错误不会被管道过滤掉。相反,如果您想删除所有错误,您需要使用相当晦涩的技巧,即使用 将错误流(stderr)重定向到“位存储桶” 2>nul:
。因此,上面的示例将变成:
icacls c:\*. /findsid someuser /t /c /l 2>nul:
但请注意,生成此类错误的某些文件夹(这些错误现已隐藏)很可能是名为“someuser”的用户有权访问但您无权访问的文件夹。因此,您可能需要三思而后行,不要直接忽略这些错误。但如果您愿意,这就是您可以做到的。
我意识到这种可能性确实会限制这个答案的价值。如果有谁更熟悉这件事情并愿意扩展或纠正我的答案,我会非常欢迎。
答案2
您可以使用 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-Output 调用的输入对象轻松地将它们输出为对象并继续使用它们(将它们导出到 CSV 文件、在找到时删除条目、使用信息更新票证……等等)。
答案3
我找到了自己问题的解决方案。我认为它非常简单明了。您只需安装 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计算导入列表,然后应用自定义过滤器,仅过滤以+文件。这些行包含用户可以访问的目录。这就是使用简单工具最终只获得相关信息的方式。
由于继承通常在父目录上启用,因此调整权限可能需要访问的实际目录数量通常明显低于列表本身。