如何获取含嵌套组用户的文件夹ACL权限并指定列输出格式
调整后的PowerShell脚本
$UncPath = 'R:\Distrib-OIS\7\Test' # 获取目标路径的非继承权限条目,排除系统默认组 $allPermissions = Get-Acl $UncPath | Select-Object -ExpandProperty Access | Where-Object { -not $_.IsInherited -and ('NT AUTHORITY\SYSTEM','BUILTIN\Administrators','CREATOR OWNER' -notcontains $_.IdentityReference) } | Select-Object @{ Name = 'Identity'; Expression = { $_.IdentityReference -replace "^[^\\]+\\(.+)", '$1' } }, FileSystemRights # 处理直接分配给用户的权限 $directUserPermissions = $allPermissions | ForEach-Object { $user = Get-ADUser -Identity $_.Identity -ErrorAction SilentlyContinue if ($user) { [PSCustomObject]@{ sAMAccountName = $user.sAMAccountName Identity = "直接分配" # 若需显示用户自身名称,可改为 $user.sAMAccountName FileSystemRights = $_.FileSystemRights } } } # 处理分配给组的权限,递归展开所有嵌套成员 $groupBasedPermissions = @() foreach ($perm in $allPermissions) { $group = Get-ADGroup -Identity $perm.Identity -ErrorAction SilentlyContinue if ($group) { # 递归获取组的所有嵌套成员(仅保留用户对象) $groupMembers = Get-ADGroupMember -Identity $group -Recursive | Where-Object { $_.objectClass -eq 'user' } foreach ($member in $groupMembers) { $groupBasedPermissions += [PSCustomObject]@{ sAMAccountName = $member.sAMAccountName Identity = $group.Name FileSystemRights = $perm.FileSystemRights } } } } # 合并结果并按用户名、所属组排序输出 $allUserPermissions = $directUserPermissions + $groupBasedPermissions $allUserPermissions | Sort-Object sAMAccountName, Identity
关键修改说明
- 递归获取嵌套组成员:使用
Get-ADGroupMember -Recursive参数直接展开组的所有嵌套层级成员,同时通过Where-Object { $_.objectClass -eq 'user' }过滤仅保留用户对象,避免包含嵌套组本身。 - 明确直接权限的标识:对于直接分配给用户的权限,将
Identity设为“直接分配”,清晰区分直接权限与通过组继承的权限;若需显示用户自身名称,可修改对应字段值。 - 优化逻辑减少冗余:重构原脚本分离的用户/组处理逻辑,用更简洁的循环完成权限关联,避免重复操作。
- 提升结果可读性:最终输出按用户名和所属组排序,方便查看同一用户的所有权限来源。
内容的提问来源于stack exchange,提问作者Vladimir Konstantinov
相关产品推荐
相关产品推荐

