PowerShell自定义对象输出出现System.Object[]异常值问题排查
问题原因解析
出现System.Object[]的核心原因是:
- 你引用的属性不是单值属性,或者在获取AD用户时未明确指定要加载的目标属性,导致PowerShell返回了对象数组而非具体的字符串值。比如误将多值属性
EmailAddresses(注意末尾复数)当成单值的EmailAddress引用,就会返回数组。 - 另外,外层用
Name作为筛选条件不合理,AD中可能存在重名用户,容易导致遍历重复或错误对象。
修正方案
- 明确指定AD用户属性:使用
Get-ADUser时,必须通过-Properties参数手动指定EmailAddress(该属性不在默认返回集合中),同时确保加载MemberOf用于获取所属组。 - 引用正确的单值属性:赋值给
UserName的必须是$user.SamAccountName(单值唯一标识),Email对应$user.EmailAddress(单值邮箱),避免使用多值属性。 - 优化遍历逻辑:直接获取所有AD用户,而非按
Name筛选,避免重名问题。
修正后的脚本示例
# 导入AD模块(部分环境需手动加载) Import-Module ActiveDirectory # 直接通过管道输出提升性能,避免数组拼接的开销 Get-ADUser -Filter * -Properties EmailAddress, MemberOf | ForEach-Object { $currentUser = $_ # 遍历用户的直接所属组 foreach ($groupDistinguishedName in $currentUser.MemberOf) { $currentGroup = Get-ADGroup -Identity $groupDistinguishedName # 构造输出对象 [PSCustomObject]@{ UserName = $currentUser.SamAccountName Email = $currentUser.EmailAddress GroupName = $currentGroup.Name } } } | Export-Csv -Path "ADUserGroups.csv" -NoTypeInformation -Encoding UTF8
额外优化
- 如果需要递归获取所有嵌套组(包括用户间接所属的组),可以替换组遍历逻辑为
Get-ADPrincipalGroupMembership:
Get-ADUser -Filter * -Properties EmailAddress | ForEach-Object { $currentUser = $_ Get-ADPrincipalGroupMembership -Identity $currentUser | ForEach-Object { [PSCustomObject]@{ UserName = $currentUser.SamAccountName Email = $currentUser.EmailAddress GroupName = $_.Name } } } | Export-Csv -Path "ADUserNestedGroups.csv" -NoTypeInformation -Encoding UTF8
内容的提问来源于stack exchange,提问作者Sandeep Kumar
相关产品推荐
相关产品推荐

