AD组Member.Count结果与实际用户数不符问题求助
问题原因分析
1. 嵌套组未递归展开
你第一个命令用Get-ADGroup的Member属性统计的是直接添加到组的成员,不会自动展开嵌套在组内的其他组中的用户;而导出CSV的命令用了Get-ADGroupMember -Recursive,会递归遍历所有嵌套组,把其中的用户也纳入统计,这是数量差异的核心原因。
另外,Member属性还会包含组、计算机等非用户对象,直接取Count会把这些也算进去,而你手动核查的是用户账户数量,这也会导致偏差。
2. AD属性的返回限制
当AD组的成员数量超过服务器默认的属性返回上限(通常为1500条,取决于AD配置),Get-ADGroup不会一次性返回所有Member值,而是采用分段(Range)返回的方式。此时直接读取$_.Member.Count只能拿到当前分段的成员数,而非总数。
准确获取用户计数的方法
根据你的需求,分为两种场景给出解决方案:
场景1:统计组的直接用户成员(不含嵌套组)
$groups = Get-Content 'C:\Users\File.txt' Foreach($group in $groups) { # 获取直接成员并过滤出用户对象 $directUserCount = (Get-ADGroupMember -Identity $group | Where-Object { $_.objectClass -eq 'user' }).Count # 输出结构化结果 [PSCustomObject]@{ 'Group Name' = $group 'Direct User Count' = $directUserCount } }
场景2:统计所有嵌套用户(与CSV导出结果一致)
方法1:用Get-ADGroupMember递归统计
$groups = Get-Content 'C:\Users\File.txt' Foreach($group in $groups) { # 递归获取所有成员并过滤用户 $totalUserCount = (Get-ADGroupMember -Identity $group -Recursive | Where-Object { $_.objectClass -eq 'user' }).Count [PSCustomObject]@{ 'Group Name' = $group 'Total User Count (Including Nested)' = $totalUserCount } }
方法2:用LDAP过滤器高效查询(适合大组)
针对成员极多的组,用LDAP的LDAP_MATCH_RULE_IN_CHAIN规则查询效率更高,避免递归遍历的性能问题:
$groups = Get-Content 'C:\Users\File.txt' Foreach($group in $groups) { # 获取组的DistinguishedName $groupDN = (Get-ADGroup -Identity $group).DistinguishedName # 递归查询所有属于该组的用户 $totalUsers = Get-ADUser -LDAPFilter "(memberOf:1.2.840.113556.1.4.1941:=$groupDN)" [PSCustomObject]@{ 'Group Name' = $group 'Total User Count (Including Nested)' = $totalUsers.Count } }
内容的提问来源于stack exchange,提问作者JCR
相关产品推荐
相关产品推荐

