You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:12:48