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

如何限制Active Directory连接数及优化AD对账脚本?

优化AD脚本连接数及性能的解决方案

1. 重用凭据对象(必做优化)

完全没必要在每次循环中调用Get-Credential,针对每个环境仅调用一次并将凭据存入变量,循环时直接复用该变量即可。这不仅减少了不必要的交互开销,还避免了重复创建凭据对象的冗余操作。
示例代码:

# 为每个环境预先获取并存储凭据
$credEnv1 = Get-Credential -Message "输入环境1的NPA凭据"
$credEnv2 = Get-Credential -Message "输入环境2的NPA凭据"

# 循环处理用户时直接复用已存储的凭据
foreach ($user in $targetUsersEnv1) {
    Disable-ADUser -Identity $user -Credential $credEnv1
    Remove-ADGroupMember -Identity "目标组名" -Members $user -Credential $credEnv1 -Confirm:$false
}

2. 手动复用LDAP连接(实现类似SQL的持久连接)

PowerShell的ActiveDirectory模块默认启用连接池,但大量循环操作场景下,池的自动管理可能不够高效,导致短连接激增。你可以直接使用.NET System.DirectoryServices.Protocols命名空间的LdapConnection类,创建一个持久连接,所有操作复用该连接,完成后手动关闭,从根源上控制连接数量。

示例代码:

# 加载必要的.NET组件
Add-Type -AssemblyName System.DirectoryServices.Protocols

# 创建针对目标域控制器的Ldap连接
$ldapServer = "dc01.yourdomain.com"
$networkCred = New-Object System.Net.NetworkCredential("NPA账号", "密码", "域名")
$ldapConn = New-Object System.DirectoryServices.Protocols.LdapConnection($ldapServer, $networkCred)
$ldapConn.SessionOptions.ProtocolVersion = 3 # 启用LDAPv3协议

try {
    # 循环处理所有用户操作,复用同一个连接
    foreach ($userDN in $userDistinguishedNames) {
        # 示例1:禁用用户(修改userAccountControl属性)
        $modifyUacRequest = New-Object System.DirectoryServices.Protocols.ModifyRequest(
            $userDN,
            [System.DirectoryServices.Protocols.DirectoryOperation]::Replace
        )
        $disabledUacValue = 514 # 512(正常启用)+2(禁用标志)
        $modifyUacRequest.Add("userAccountControl", [byte[]][System.BitConverter]::GetBytes($disabledUacValue))
        $ldapConn.SendRequest($modifyUacRequest)

        # 示例2:从指定组移除用户
        $removeMemberRequest = New-Object System.DirectoryServices.Protocols.ModifyRequest(
            "CN=目标组,OU=Groups,DC=yourdomain,DC=com",
            [System.DirectoryServices.Protocols.DirectoryOperation]::Remove
        )
        $removeMemberRequest.Add("member", [string]$userDN)
        $ldapConn.SendRequest($removeMemberRequest)
    }
}
finally {
    # 操作完成后务必关闭连接
    $ldapConn.Dispose()
}

3. 限制AD连接数的其他辅助方法

  • 调整.NET连接池参数:通过ServicePointManager限制LDAP连接的池大小,辅助减少连接数:
# 设置全局最大连接点数量
[System.Net.ServicePointManager]::MaxServicePoints = 10
# 针对特定域控制器设置单连接点的连接限制
[System.Net.ServicePointManager]::FindServicePoint("ldap://dc01.yourdomain.com").ConnectionLimit = 5
  • 指定固定域控制器:在AD模块命令中通过-Server参数指定固定DC,避免模块自动切换DC导致的新连接创建,让连接池可以稳定复用同一DC的连接。

4. 其他性能优化建议

  • 批量操作替代单条循环:尽可能使用批量处理逻辑,减少AD命令调用次数:
# 批量禁用符合条件的用户
Get-ADUser -Filter "Enabled -eq $true -and Department -eq '待清理部门'" -Credential $cred | Disable-ADUser -Credential $cred
# 批量移除多个用户出组
Remove-ADGroupMember -Identity "目标组" -Members $bulkUserList -Credential $cred -Confirm:$false
  • 预获取所有目标用户:提前一次性查询出所有需要处理的用户集合,避免循环内重复查询AD服务器:
# 预获取所有待处理用户的核心属性
$targetUsers = Get-ADUser -Filter "Enabled -eq $true -and Department -eq '待清理部门'" -Properties DistinguishedName
# 循环处理本地存储的用户集合
foreach ($user in $targetUsers) {
    # 执行禁用、移组等操作
}
  • 使用精准LDAP筛选器:优先使用LDAP原生筛选器而非PowerShell筛选器,减少AD服务器端的数据返回量:
# 用LDAP筛选器精准定位待处理用户
$targetUsers = Get-ADUser -LDAPFilter "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=512)(department=待清理部门))"
  • 仅请求必要属性:通过-Properties参数指定仅需要的属性,避免默认返回多余属性带来的数据传输开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:15:43