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

AD PowerShell脚本无法找到部分已存在的组,请求技术协助

问题描述

我编写了如下PowerShell脚本用于检索Active Directory(AD)中的组,脚本整体运行正常,但部分明确存在于AD中的组无法被找到,且抛出无法定位对象的错误。

脚本代码

Import-Module ActiveDirectory

$groups = Get-ADGroup -Filter {(Name -like "F_*" -or Name -like "G_*" -or Name -like "CAX_*")} -Properties Name, GroupCategory | Sort-Object -Property Name

$emptyGroups = @()

foreach ($group in $groups) {
    # Verifica se o grupo é do tipo "Segurança"
    if ($group.GroupCategory -eq 'Security') {
        try {
            $user = Get-ADGroupMember -Identity $group.Name -ErrorAction Stop
            
            if ($user.Count -eq 0) {
                $emptyGroups += $group.Name
            }
        }
        catch {
            Write-Host "Warning: Group '$($group.Name)' could not be found or accessed."
        }
    }
    else {
        Write-Host "Info: Group '$($group.Name)' is not a security group and will be skipped."
    }
}

Write-Host "Empty Groups:"
$emptyGroups | ForEach-Object { Write-Host $_ }

报错信息

Warning: Group 'CAX_BOCAL_265_ORVR_G_L' could not be found or accessed.
Warning: Group 'CAX_GM_GEM_JCCC1_G_E' could not be found or accessed.
Warning: Group 'CAX_GM_GEM_JCCC1_G_L' could not be found or accessed.

错误详情

Não é possível localizar um objeto com identidade: 'CAX_BOCAL_265_ORVR_G_L' em: 'DC=myLDAP,DC=com'.
(翻译:无法在'DC=myLDAP,DC=com'中找到标识为'CAX_BOCAL_265_ORVR_G_L'的对象。)


问题排查与原因分析

1. 核心原因:Name作为标识存在歧义

AD允许不同组织单元(OU)下存在同名组,当使用$group.Name作为Get-ADGroupMember的-Identity参数时,PowerShell无法精准定位到目标组——可能匹配到其他OU的同名组,或因缺少OU上下文导致查询失败。

此外,Name并非AD的全局唯一标识,相比之下,DistinguishedName(DN)或SID是全局唯一的,用它们作为标识能避免这类问题。

2. 其他可能诱因

  • 权限缺失:执行脚本的账号对报错组没有读取成员的权限,导致Get-ADGroupMember无法访问。可尝试用高权限账号验证。
  • 逻辑删除的组对象:Get-ADGroup默认会返回逻辑删除的对象,但这类对象无法被Get-ADGroupMember访问。可在Get-ADGroup的Filter中添加-and isDeleted -ne $true排除这类对象。
  • 多域/跨域环境:如果AD是多域架构,Get-ADGroup可能从全局编录获取了其他域的组,但Get-ADGroupMember默认只查询当前域,导致无法找到对象。需指定-Server参数指向组所在的域控制器。

修复方案

将Get-ADGroupMember的-Identity参数替换为AD全局唯一的标识,比如DistinguishedName或SID,同时优化空组判断逻辑(单个成员时$user.Count不存在):

修改后的关键代码段:

try {
    # 使用DistinguishedName确保精准定位
    $members = Get-ADGroupMember -Identity $group.DistinguishedName -ErrorAction Stop
    # 兼容无成员/单个成员的情况
    if ($null -eq $members -or @($members).Count -eq 0) {
        $emptyGroups += $group.Name
    }
}
catch {
    Write-Host "Warning: Group '$($group.Name)' could not be found or accessed. Error: $_"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:07:09