为何Script#1用Get-ADUser获取AD组不全?如何修复至Script#2效果?
为什么Script#1无法获取所有AD组?
核心差异:两个Cmdlet的组覆盖范围不同
Get-ADUser的memberof属性仅返回用户直接手动加入的安全组/通讯组,不包含用户的主组。默认情况下,域用户的主组是Domain Users,这个组不会出现在memberof列表里,这就是Script#1只拿到1个组的根本原因。Get-ADPrincipalGroupMembership会返回用户所属的全部组,包括直接加入的组和系统默认的主组,所以Script#2能正确拿到2个组。
Script#1的额外问题:变量类型导致Count显示异常
当memberof只有1个组时,$AD_user.memberof是单个字符串而非数组,经过-join ';'转换后,$AD_groups变成了字符串类型。此时$AD_groups.Count返回的不是组的数量,而是字符串对象的计数(PowerShell旧版本中单个字符串的Count为1),这和统计组数量的需求不符。
修复后的Script#1代码
要让Script#1和Script#2结果一致,需要补充获取主组,并修正变量类型问题:
$AD_ID="YOUR AD SAM" # 同时获取memberof和primaryGroupID属性 $AD_user=Get-ADUser -Identity $AD_ID -Properties memberof, primaryGroupID # 获取直接加入的组名称 $directGroups = $AD_user.memberof | ForEach-Object { (Get-ADGroup $_).Name } # 通过primaryGroupID匹配获取主组名称 $primaryGroup = Get-ADGroup -Filter "objectSID -like '*-$($AD_user.primaryGroupID)'" | Select-Object -ExpandProperty Name # 合并所有组并去重、排序 $allGroups = $directGroups + $primaryGroup | Sort-Object -Unique # 转换为分号分隔的字符串 $AD_groups = $allGroups -join ';' # 输出组数量和结果 $allGroups.Count $AD_groups
修复说明
- 新增获取
primaryGroupID属性,通过SID后缀匹配找到用户的主组,补充了memberof缺失的组 - 先以数组形式保存所有组,统计数量后再转换为字符串,确保Count是真实的组数量
- 加入
Sort-Object -Unique避免可能的重复组(主组通常不会出现在memberof中,作为冗余处理)
内容的提问来源于stack exchange,提问作者MDaver_CyberSec
相关产品推荐
相关产品推荐

