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

如何突破System.DirectoryServices.DirectoryEntry修改AD组的1500成员限制?

我之前也踩过AD组成员数量限制的这个坑!当时写PowerShell脚本批量把50多个AD位置的成员加到公共组时,用System.DirectoryServices.DirectoryEntry直接操作就触发了1500成员的限制,后来摸索出两个实用的解决办法,分享给你:

方法1:用AccountManagement命名空间(推荐)

这个.NET命名空间是专门为AD账号管理设计的,内部已经自动处理了成员数量限制的问题,不用自己手动分批,代码也更简洁:

# 加载必需的程序集
Add-Type -AssemblyName System.DirectoryServices.AccountManagement

# 初始化域上下文
$domainContext = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Domain)

# 获取目标公共组
$targetGroup = [System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($domainContext, "你的公共组名称")

# 假设$allUsers是你从AD位置扫描到的用户身份列表(可以是用户名或DN)
foreach ($userIdentity in $allUsers) {
    $userPrincipal = [System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity($domainContext, $userIdentity)
    if ($userPrincipal) {
        $targetGroup.Members.Add($userPrincipal)
    }
}

# 保存所有更改
$targetGroup.Save()

这个方法完全不用关心1500的限制,底层会自动分片提交修改,省心很多。

方法2:手动分批使用DirectoryEntry操作

如果你倾向于继续用原来的System.DirectoryServices.DirectoryEntry方案,那就需要把成员列表分成每1499个一批(留一点余量避免触发限制),然后用AddRange批量提交:

# 假设$allMemberDNs是你收集到的所有要添加的用户LDAP路径(DN)
$batchSize = 1499
for ($index = 0; $index -lt $allMemberDNs.Count; $index += $batchSize) {
    # 截取当前批次的成员DN
    $currentBatch = $allMemberDNs[$index..($index + $batchSize - 1)]
    # 获取组的DirectoryEntry对象
    $oGroup = [ADSI]"LDAP://CN=你的公共组,OU=Groups,DC=yourdomain,DC=com"
    # 批量添加当前批次的成员
    $oGroup.Properties["member"].AddRange($currentBatch)
    # 提交更改
    $oGroup.CommitChanges()
}

这里要注意必须用AddRange而不是循环逐个Add,因为Add是单次提交一个成员,效率低还容易触发限制,AddRange可以一次性提交一批,结合分批逻辑就能避开1500的上限。

补充一句:这个1500的限制是AD默认的单次修改member属性的条目数上限,虽然可以修改服务器配置,但不推荐这么做,在脚本层面处理是更安全、通用的方案。

内容的提问来源于stack exchange,提问作者fsteff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:01:41