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

PowerShell跨域批量移除AD用户所属组时出现ADReferralException报错

报错根因分析

两个报错都是跨域AD操作时未显式指定寻址目标、对象标识不明确导致的,具体对应原因:

  • A referral was returned from the server(错误ID 8235):你通过India.local的域控addc45.india.local查询到的用户所属组,不全属于India.local域——其中部分组属于Us.local或其他受信任域。调用Remove-ADGroupMember时未指定操作对应的域控,cmdlet默认连接当前上下文所在域(从报错看是Us.local)的DC执行操作,该DC发现目标组不属于自身管辖域,会返回referral响应告知客户端应去组所属域的DC操作,但AD PowerShell模块默认不会自动跟随这类引用跳转,因此触发报错。
  • Cannot find an object with identity: 'IN100040' under: 'DC=US,DC=local':你给-member参数传入的是用户的SamAccountName(即IN100040这类短ID),当操作Us.local域的组时,cmdlet默认在Us.local域下查找该ID对应的对象,但India.local的用户属于跨域安全主体,不会在Us.local域中以同域对象的形式存在,仅用短ID无法匹配到正确的用户对象,因此触发找不到对象的报错。

*额外注意:你当前脚本只写了移除组的逻辑,实际没有执行禁用账号的操作,日志打印的"Disabled"只是文本输出,没有实际生效。

可行解决方法

修复核心逻辑:

  1. 遍历用户所属组时,先从组的可分辨名称(DN)解析出组所属的域名,显式给Remove-ADGroupMember指定对应域作为操作目标,触发cmdlet自动连接对应域的DC执行操作,避免referral错误。
  2. 传入组成员参数时,不用短ID,改用用户的完整可分辨名称(DN),确保跨域场景下AD能准确定位到用户对象,避免找不到对象的错误。
  3. 补充缺失的账号禁用逻辑,匹配实际需求。

修正后的可直接使用的脚本如下:

# 导入离职用户列表
$users = Import-Csv -Path C:\Users\Desktop\DisableUsers.csv
$totalcount = $users.Count
Write-Host "共加载 $totalcount 个待处理账号"
$currentCount = 1

Foreach ($u in $users)
{
    # 连接India.local域控获取用户完整属性,包含所属组列表、自身DN
    $adUser = Get-ADUser -Server "addc45.india.local" -Identity $u.UserID -Properties MemberOf, DistinguishedName
    if (-not $adUser) {
        Write-Host "未找到用户 $($u.UserID),跳过处理"
        $currentCount++
        continue
    }

    # 遍历移除所有所属组
    foreach ($groupDN in $adUser.MemberOf) {
        # 从组DN解析所属域名,例:DC=india,DC=local 解析为 india.local
        $groupDomain = ($groupDN -split ',DC=') | Select-Object -Skip 1 | Join-String -Separator '.'
        try {
            Remove-ADGroupMember -Server $groupDomain -Identity $groupDN -Members $adUser.DistinguishedName -Confirm:$false -ErrorAction Stop
        }
        catch {
            Write-Warning "移除用户 $($u.UserID) 组 $groupDN 失败:$($_.Exception.Message)"
        }
    }

    # 禁用India.local域的目标账号
    Disable-ADAccount -Server "addc45.india.local" -Identity $adUser -ErrorAction SilentlyContinue

    Write-Host "已处理完成 $($u.UserID),进度 $currentCount / $totalcount"
    $currentCount++
}

前置校验项

  • 执行脚本的账号需要同时拥有两个域的对应权限:India.local域的用户账号修改权限、两个域内所有目标组的成员修改权限。
  • 执行脚本的机器需要能正常解析两个域的DNS SRV记录,确保可以正常连接两个域的可用域控。
  • 建议先选取1-2个测试账号执行验证,确认跨域组移除、账号禁用逻辑都正常后,再执行全量批量操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:54:33