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

PowerShell获取AD嵌套安全组成员时Identity参数空值错误排查

修复PowerShell嵌套AD组成员查询脚本的错误

错误原因分析

报错提示Identity参数为null,说明调用Get-ADGroup时传入的$group变量是空值,结合脚本场景,触发点包括:

  • 导入的CSV文件中MailingList列存在空行/空值,主循环调用ShowUser时传入了null
  • 脚本存在语法错误(if语句的大括号格式错误),导致执行流程异常,间接引发变量为空
  • 递归调用时,部分嵌套组的SamAccountName为空(AD组一般不会出现,但需做防御性校验)

具体修复步骤

1. 修正语法错误

脚本中if($member.ObjectClass -eq "user"}{的大括号格式错误,应改为:

if($member.ObjectClass -eq "user") {

2. 添加参数空值校验

在ShowUser函数开头添加校验,避免传入空值时执行后续逻辑:

function ShowUser ($group){
    # 校验参数是否为空
    if([string]::IsNullOrEmpty($group)){
        Write-Warning "传入的组名称为空,跳过处理"
        return
    }
    # 原有逻辑...
}

3. 主循环添加空值过滤

在遍历CSV的主循环中,先判断MailingList是否为空,再调用函数:

Foreach($parentgroup in $parentgroups){
    if(-not [string]::IsNullOrEmpty($parentgroup.MailingList)){
        ShowUser $parentgroup.MailingList
    } else {
        Write-Warning "CSV中存在空的组名称,行内容:$($parentgroup | Out-String)"
    }
}

4. 优化递归查询与导出逻辑

原脚本中$Table = $Record会覆盖之前的数据(虽然后续直接导出了,但逻辑冗余),可以直接导出$Record;同时针对跨域场景,改用Get-ADObject查询组,避免Get-ADGroup仅查询当前域的限制:

function ShowUser ($group){
    if([string]::IsNullOrEmpty($group)){
        Write-Warning "传入的组名称为空,跳过处理"
        return
    }
    # 用Get-ADObject查询组,支持跨域场景
    $groupObj = Get-ADObject -Filter "SamAccountName -eq '$group' -and ObjectClass -eq 'group'"
    if(-not $groupObj){
        Write-Warning "未找到组:$group"
        return
    }
    $dn = $groupObj.DistinguishedName
    $members = Get-ADObject -LDAPFilter "(memberOf=$dn)" -Properties SamAccountName, ObjectClass

    Foreach($member in $members){
        if($member.ObjectClass -eq "user"){
            $Record = [PSCustomObject]@{
                SubSecurityGroup = $group
                UserAccount = $member.SamAccountName
            }
            $Record | Export-Csv -Append -Path $filepath -NoTypeInformation
        }
        elseif ($member.objectClass -eq "group") {
            ShowUser $member.SamAccountName
        }
    }
}

5. 检查CSV文件内容

确认导入的CSV文件中MailingList列的所有行都有有效的组名称,没有空值或格式错误的内容。

修复后的完整脚本

$csvpath = "xxxxx.csv"
$parentgroups = Import-Csv -Encoding Default $csvpath

$filepath = "xxxxxxx.csv"
# 提前清空输出文件(可选,避免重复追加)
if(Test-Path $filepath){
    Remove-Item $filepath -Force
}

# 获取嵌套组的用户
function ShowUser ($group){
    if([string]::IsNullOrEmpty($group)){
        Write-Warning "传入的组名称为空,跳过处理"
        return
    }

    $groupObj = Get-ADObject -Filter "SamAccountName -eq '$group' -and ObjectClass -eq 'group'"
    if(-not $groupObj){
        Write-Warning "未找到AD组:$group"
        return
    }

    $dn = $groupObj.DistinguishedName
    $members = Get-ADObject -LDAPFilter "(memberOf=$dn)" -Properties SamAccountName, ObjectClass

    Foreach($member in $members){
        if($member.ObjectClass -eq "user"){
            $Record = [PSCustomObject]@{
                SubSecurityGroup = $group
                UserAccount = $member.SamAccountName
            }
            $Record | Export-Csv -Append -Path $filepath -NoTypeInformation
        }
        elseif ($member.objectClass -eq "group") {
            ShowUser $member.SamAccountName
        }
    }
}

# 主循环处理CSV中的父组
Foreach($parentgroup in $parentgroups){
    if(-not [string]::IsNullOrEmpty($parentgroup.MailingList)){
        ShowUser $parentgroup.MailingList
    } else {
        Write-Warning "CSV中存在空的组名称,行数据:$($parentgroup | Out-String)"
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:37:05