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
相关产品推荐
相关产品推荐

