将AD组A成员复制到组B时遇请求大小限制报错求助
解决AD组超过10000成员时的复制问题
问题分析
Get-ADGroupMember默认有10000条结果的限制,当组成员超过这个数量时会触发「请求大小限制超出」错误。- 原脚本每次循环都重复查询Group B的成员,性能极差;且用
Name判断成员是否存在容易出错(AD允许同名用户/组),同时判断逻辑写反(存在时反而执行添加操作)。
解决方案
核心思路
- 突破10000条限制:用
Get-ADGroup读取组的member属性,AD模块会自动处理分页,支持获取超量成员。 - 优化性能:提前一次性获取Group B的所有递归成员,避免循环内重复查询。
- 精准批量添加:用唯一标识(
distinguishedName)判断成员是否存在,筛选出需添加的成员后批量操作,减少AD交互次数。
修正后的脚本
# 获取Group A的所有成员DN(突破10000条限制) $groupAMembers = (Get-ADGroup -Identity "Group A" -Properties member).member # 获取Group B的所有递归成员DN $groupBMembers = Get-ADGroupMember -Identity "Group B" -Recursive | Select-Object -ExpandProperty distinguishedName # 筛选出Group A中不在Group B的成员 $membersToAdd = $groupAMembers | Where-Object { $_ -notin $groupBMembers } # 批量添加成员(仅当有需要添加的成员时执行) if ($membersToAdd.Count -gt 0) { Add-ADGroupMember -Identity "Group B" -Members $membersToAdd Write-Host "成功添加 $($membersToAdd.Count) 个成员到Group B" } else { Write-Host "Group B已包含Group A的所有成员,无需操作" }
补充说明
如果Group A包含嵌套组,需要将嵌套组内的成员也复制到Group B(而非复制组本身),可以使用递归函数展开所有成员:
# 递归获取组的所有成员(包括嵌套组内的用户/组) function Get-ADGroupAllMembers { param([string]$GroupIdentity) $group = Get-ADGroup -Identity $GroupIdentity -Properties member foreach ($memberDN in $group.member) { $member = Get-ADObject -Identity $memberDN if ($member.ObjectClass -eq 'group') { Get-ADGroupAllMembers -GroupIdentity $memberDN } else { $memberDN } } } # 获取Group A的所有递归成员 $groupAMembers = Get-ADGroupAllMembers -GroupIdentity "Group A"
内容的提问来源于stack exchange,提问作者maj
相关产品推荐
相关产品推荐

