PowerShell导出AD组到CSV时Members显示ADPropertyValueCollection问题
解决AD组导出CSV时Members列显示类型名的问题
问题原因
Get-ADGroup返回的Members属性是Microsoft.ActiveDirectory.Management.ADPropertyValueCollection类型的集合对象,Export-Csv仅能序列化字符串或基础数据类型,无法直接解析集合对象,因此导出时会输出对象类型名称而非实际成员内容。
解决方法
需要将Members集合转换为可读的字符串格式,以下提供两种常用方案:
方案1:直接拼接成员的DistinguishedName(高效)
这种方法直接将成员的DN用分隔符拼接成字符串,无需额外AD查询,执行速度快:
# 设置输出路径和文件名 $directoryandfilename = Read-Host -Prompt 'Enter directory and file name for output - Example - C:\Control\Test\Test.csv' # 查询AD组并转换Members为字符串 Get-ADGroup -Filter * -SearchBase "OU=Name,OU=Name,DC=DCName,DC=Name,DC=Name,DC=Name,DC=Name" -Properties Members | Select-Object DisplayName, @{Name='Members'; Expression={$_.Members -join ';'}}, # 用分号拼接成员DN,可替换为逗号等分隔符 DistinguishedName | Sort-Object DistinguishedName | Export-Csv $directoryandfilename -NoTypeInformation
注:DisplayName和DistinguishedName是Get-ADGroup的默认返回属性,无需通过-Properties指定;避免使用-Properties *,它会返回所有属性,增加AD查询负载,建议只指定需要的属性(如这里的Members)。
方案2:获取成员的显示名称(更易读)
如果需要成员的DisplayName而非DN,需逐个查询每个成员的属性,适合对可读性要求高的场景:
# 设置输出路径和文件名 $directoryandfilename = Read-Host -Prompt 'Enter directory and file name for output - Example - C:\Control\Test\Test.csv' # 查询AD组并获取成员显示名称 Get-ADGroup -Filter * -SearchBase "OU=Name,OU=Name,DC=DCName,DC=Name,DC=Name,DC=Name,DC=Name" -Properties Members | ForEach-Object { # 遍历成员,获取每个成员的DisplayName $memberNames = $_.Members | ForEach-Object { (Get-ADObject $_ -Properties DisplayName).DisplayName } # 构造自定义对象 [PSCustomObject]@{ DisplayName = $_.DisplayName Members = $memberNames -join ';' DistinguishedName = $_.DistinguishedName } } | Sort-Object DistinguishedName | Export-Csv $directoryandfilename -NoTypeInformation
注:此方案会发起额外的AD查询,若组数量多、成员量大,执行速度会变慢。
内容的提问来源于stack exchange,提问作者NuckinFutz
相关产品推荐
相关产品推荐

