如何用PowerShell查询文件夹权限列表中的AD组?
查找指定文件夹关联的AD组问题解决
你的代码无法识别AD组是因为这些组在ACL中以SID形式存在,未被解析为可读的组名称,导致前缀过滤失效。以下是修正后的解决方案:
修正后的PowerShell代码
$FolderPath = "W:\my_path" $GroupPrefix = "A_Known_Prefix_Of_Each_Group" # 获取目标文件夹的访问控制列表 $Acl = Get-Acl -Path $FolderPath # 解析权限条目中的SID为可读名称,并过滤指定前缀的AD组 $Groups = $Acl.Access | ForEach-Object { $identity = $_.IdentityReference # 判断是否为AD域SID格式(S-1-5-21开头) if ($identity.Value -match "^S-1-5-21-") { try { # 将SID转换为NTAccount格式(域\组名) $ntAccount = $identity.Translate([System.Security.Principal.NTAccount]) $ntAccount.Value } catch { # 解析失败时保留原SID $identity.Value } } else { $identity.Value } } | Where-Object { $_ -like "${GroupPrefix}*" } | Select-Object -Unique Write-Host "拥有$FolderPath访问权限的AD组->" $Groups
关键说明
- SID解析:通过
Translate方法将AD组的SID转换为域\组名的可读格式,让前缀过滤规则能正常匹配。 - 去重处理:使用
Select-Object -Unique避免同一个组因多条权限规则重复出现。 - 兼容性:无需依赖Active Directory模块,纯.NET类即可完成SID解析,适用于大多数Windows环境。
自动化扩展(添加用户到对应AD组)
如果要实现用户请求权限时自动添加到目标组,可结合Active Directory模块的Add-ADGroupMember命令:
$targetUser = "DOMAIN\UserName" # 替换为实际用户名 $Groups | ForEach-Object { Add-ADGroupMember -Identity $_ -Members $targetUser Write-Host "已将用户 $targetUser 添加到组 $_" }
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

