Powershell 以递归方式列出域用户可以访问的所有目录

Powershell 以递归方式列出域用户可以访问的所有目录,powershell,Powershell,递归列出所有目录非常简单,如下所示: Get-ChildItem G:\ -recurse -directory 编写一个列出特定目录权限的函数非常简单: get-acl $folder.access 如何递归检查每个目录的ACL,然后仅输出域用户组可以访问的目录的列表?您可以执行以下操作: Get-ChildItem G:\ -Directory -Recurse -ErrorAction SilentlyContinue | Where { try { (Get-Acl -Lit

递归列出所有目录非常简单,如下所示:

Get-ChildItem G:\ -recurse -directory
编写一个列出特定目录权限的函数非常简单:

get-acl $folder.access
如何递归检查每个目录的ACL,然后仅输出域用户组可以访问的目录的列表?

您可以执行以下操作:

Get-ChildItem G:\ -Directory -Recurse -ErrorAction SilentlyContinue | 
   Where { try { (Get-Acl -LiteralPath $_.FullName | Select -ExpandProperty Access | 
      Where { $_.IdentityReference -eq "MYDOMAIN\Domain Users" `
              -and ($_.FileSystemRights -band [System.Security.AccessControl.FileSystemRights]::Read) -eq [System.Security.AccessControl.FileSystemRights]::Read `
              -and $_.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Allow }) } catch { } }
Where对象
中的
try
catch
块是为了避免错误,因为当您无法访问路径时,
Get Acl
将始终引发错误,即使您将
-ErrorAction SilentlyContinue设置为

Where对象的说明

搜索“MYDOMAIN\Domain用户”:

$\u.IdentityReference-eq“MYDOMAIN\Domain用户”

至少具有读访问权限的

($\.FileSystemRights-band[System.Security.AccessControl.FileSystemRights]::Read)-eq[System.Security.AccessControl.FileSystemRights]::Read

允许类型(可能被拒绝)

$\uU4.AccessControlType-eq[System.Security.AccessControl.AccessControlType]:允许执行以下操作:

Get-ChildItem G:\ -Directory -Recurse -ErrorAction SilentlyContinue | 
   Where { try { (Get-Acl -LiteralPath $_.FullName | Select -ExpandProperty Access | 
      Where { $_.IdentityReference -eq "MYDOMAIN\Domain Users" `
              -and ($_.FileSystemRights -band [System.Security.AccessControl.FileSystemRights]::Read) -eq [System.Security.AccessControl.FileSystemRights]::Read `
              -and $_.AccessControlType -eq [System.Security.AccessControl.AccessControlType]::Allow }) } catch { } }
Where对象
中的
try
catch
块是为了避免错误,因为当您无法访问路径时,
Get Acl
将始终引发错误,即使您将
-ErrorAction SilentlyContinue设置为

Where对象的说明

搜索“MYDOMAIN\Domain用户”:

$\u.IdentityReference-eq“MYDOMAIN\Domain用户”

至少具有读访问权限的

($\.FileSystemRights-band[System.Security.AccessControl.FileSystemRights]::Read)-eq[System.Security.AccessControl.FileSystemRights]::Read

允许类型(可能被拒绝)


$\uu.AccessControlType-eq[System.Security.AccessControl.AccessControlType]:Allow

经过一些阅读和修改,我认为我找到了一个合适的解决方案:

Get-ChildItem -recurse -directory G:\ | Where {(get-acl $_.fullname).access.IdentityReference -Match "mydomain\\Domain Users"}

经过一些阅读和修改,我认为我已经找到了一个合适的解决方案:

Get-ChildItem -recurse -directory G:\ | Where {(get-acl $_.fullname).access.IdentityReference -Match "mydomain\\Domain Users"}

我会使用一个普通的域用户帐户,看看能读到什么。。。无需解析权限,只需查看允许该帐户查看的内容。是的,这是一个快速的破解,但如果需要,我想将其推广到其他组。更不用说递归地单击整个目录树需要花费很长时间。然后我必须记录我的发现,这也可能是人为的错误。我不是有意要手工做的。[咧嘴笑]像
机器人复制
这样的东西可以快速读取完整的树。。。这会让你知道你想要的是什么。如果您想测试一个组,那么创建一个仅在该组中的测试帐户。。。我会使用一个普通的域用户帐户,看看能读到什么。。。无需解析权限,只需查看允许该帐户查看的内容。是的,这是一个快速的破解,但如果需要,我想将其推广到其他组。更不用说递归地单击整个目录树需要花费很长时间。然后我必须记录我的发现,这也可能是人为的错误。我不是有意要手工做的。[咧嘴笑]像
机器人复制
这样的东西可以快速读取完整的树。。。这会让你知道你想要的是什么。如果您想测试一个组,那么创建一个仅在该组中的测试帐户。。。虽然我很感激能够处理错误并使解决方案变得健壮,但请记住我是域管理员,所以我应该能够阅读整个目录树。然而,这无疑是最彻底的解决办法。再次感谢。不客气,您可以将其标记为已回答;)选中C:\,您将看到即使域管理员也无法读取整个目录树(默认情况下);)尽管我很感激能够处理错误并使解决方案变得健壮,但请记住,我是域管理员,所以我应该能够阅读整个目录树。然而,这无疑是最彻底的解决办法。再次感谢。不客气,您可以将其标记为已回答;)选中C:\,您将看到即使域管理员也无法读取整个目录树(默认情况下);)否,您需要将
AccessControlType
也检查为
Allow
,否则这也可能列出
Deny
。所以我认为你应该接受。是的,同意。cfu的错误检查也会处理由于文件系统上不再存在而无法读取的对象。不,您需要将
AccessControlType
也检查为
Allow
,否则也可能列出
Deny
。所以我认为你应该接受。是的,同意。CFU的错误检查还负责处理无法读取的对象,因为它们不再存在于文件系统中。