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


14

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

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

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

有任何想法吗?


1
这就是为什么即使组中只有一个用户,也应该始终基于组授予成员资格的原因。您可以将他从小组中删除。在等待答案的同时,您只需在AD中禁用他的帐户即可。
MDMarra

您是否尝试过此工具:AccessChk v5.0?为了确保他们创建了安全的环境,Windows管理员经常需要了解特定用户或组对资源的访问权限,这些访问权限包括文件,目录,注册表项,全局对象和Windows服务。AccessChk通过直观的界面和输出快速回答这些问题。此处找到:technet.microsoft.com/en-us/sysinternals/bb664922.aspx
Luke99 2010年

@MarkM:的确如此……只是当用户需要访问单个文件夹时,才添加他。然后几个月后,他需要另一个完全不同的共享权限。并在几个月后再次放在2或3个文件夹中。如何为该用户创建一个具有有意义名称的组?“ Username_granular_access_group”?这可能会解决问题。@ Luke99:Sysinternals的有趣工具。我怎么会想念它。无论如何,我看到它显示了用户具有直接或间接访问权限的所有文件夹。有没有办法只显示在ACL中明确列出用户的文件夹(不包括通过组访问的文件夹)?
imagodei

Answers:


13

这似乎可以解决问题(可能需要警告),使用内置的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”的用户可以访问但您没有访问的文件夹。因此,您可能需要三思而后行而忽略这些错误。但是,如果您愿意,这就是您可以做到的。

我意识到,这种可能性可能会限制该答案的价值。如果有人对事情更熟悉,想扩大或纠正我的答案,我将欢迎您。


似乎应该很明显,但需要指出:搜索*。不等于仅搜索目录或搜索所有目录。目录名称可以具有扩展名,文件不必具有扩展名。如果您想彻底了解它,请搜索所有内容。
Scott E

6

您可以使用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-输出呼叫。


也可以“排除”继承的权限吗?(即搜索每个文件夹,其中已经以显式方式添加了“ DOMAIN \ Username”?
dognose 2016年

1
是的,您可以:if ($ACL.IdentityReference -like $ReferenceAccountName -and !$ACL.IsInherited){
dognose

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 Calc导入列表,然后应用自定义过滤器,仅对以+ FILE开头的行进行过滤。这些行包含用户有权访问的目录。这就是使用简单工具最终仅获得相关信息的方式。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.