拉取AD组成员信息并导出到文件的脚本问题排查求助
问题原因梳理
- 组名字段为空的核心原因:
Get-Content返回的是纯字符串数组,每个$Group变量是字符串类型,没有Name属性,$Group.Name取值自然为空;同时原脚本自定义对象的两个属性之间缺少逗号分隔,属于语法错误,也会导致字段赋值异常 Import-Csv读取失败大概率是编码问题:第一次导出CSV时没有指定编码,系统默认编码和Import-Csv默认读取编码不匹配导致解析失败
修复方案
方案1:直接使用第一次导出的CSV作为输入(推荐,无需转格式)
# 导入首次导出的AD组CSV文件 $Groups = Import-Csv -Path 'C:\Users\me\Documents\1_member_groups.csv' -Encoding Default $ErrorActionPreference = 'Continue' $Results = foreach ($Group in $Groups) { # 使用组的可分辨名称作为查询标识,避免重名冲突 Get-ADGroupMember -Identity $Group.DistinguishedName | ForEach-Object { [pscustomobject]@{ GroupName = $Group.Name MemberName = $_.Name MemberAccount = $_.SamAccountName } } } $Results | Export-Csv -Path 'C:\Users\me\Desktop\group_members.csv' -NoTypeInformation -Encoding UTF8
方案2:坚持使用TXT格式输入的修复版本
# 读取TXT文件并过滤空行 $Groups = Get-Content -Path 'C:\Users\me\Documents\1_member_groups.txt' | Where-Object { $_.Trim() -ne '' } $ErrorActionPreference = 'Continue' $Results = foreach ($Group in $Groups) { Get-ADGroupMember -Identity $Group | ForEach-Object { [pscustomobject]@{ GroupName = $Group # 直接使用字符串变量,无需调用.Name属性 MemberName = $_.Name } } } $Results | Export-Csv -Path 'C:\Users\me\Desktop\test1.csv' -NoTypeInformation -Encoding UTF8
方案3:一步到位无需中间文件的实现
不需要分开两次执行脚本,单次执行即可直接导出符合要求的结果:
Get-ADGroup -Filter * -Properties Members | Where-Object { $_.Members.Count -eq 1 } | ForEach-Object { $currentGroupName = $_.Name Get-ADGroupMember -Identity $_ | ForEach-Object { [pscustomobject]@{ GroupName = $currentGroupName MemberName = $_.Name MemberAccount = $_.SamAccountName } } } | Export-Csv -Path 'C:\Users\me\Desktop\1_member_group_with_members.csv' -NoTypeInformation -Encoding UTF8
内容的提问来源于stack exchange,提问作者destinyunbound3
相关产品推荐
相关产品推荐

