如何用PowerShell获取含用户与联系人的AD组成员列表(带指定属性)
解决PowerShell导出AD组用户和联系人并统一属性的问题
要同时导出AD组内的用户和联系人,且统一显示所需属性,可以通过Get-ADObject兼容两种对象类型,并手动映射统一字段,具体步骤如下:
完整命令示例
# 1. 递归获取目标组的所有成员(包括嵌套组)的DistinguishedName $groupMembers = Get-ADGroupMember "MyGroupName" -Recursive | Select-Object -ExpandProperty DistinguishedName # 2. 遍历每个成员,获取AD对象并统一属性字段 $exportData = foreach ($dn in $groupMembers) { try { # 获取对象及所需原生AD属性(兼容用户和联系人) $adObj = Get-ADObject -Identity $dn -Properties company, sn, givenName, mail -ErrorAction Stop # 构建统一格式的输出对象 [PSCustomObject]@{ Company = $adObj.company Surname = $adObj.sn ?? ($adObj.cn -split ' ', 2)[-1] # 优先用sn属性,无则从CN拆分姓氏 GivenName = $adObj.givenName ?? ($adObj.cn -split ' ', 2)[0] # 优先用givenName,无则从CN拆分名字 Email = $adObj.mail ObjectType = $adObj.ObjectClass # 可选:标记是用户还是联系人 } } catch { # 处理获取失败的对象,记录警告并添加错误条目 Write-Warning "无法读取对象 [$dn] : $_" [PSCustomObject]@{ Company = "读取失败" Surname = $dn.Split(',')[0].Replace('CN=', '') GivenName = "" Email = "" ObjectType = "未知" } } } # 3. 排序并导出为CSV $exportData | Sort-Object -Property Company, Surname | Export-CSV -Path "$home\Desktop\MyGroupName.csv" -NoTypeInformation
关键说明
- 兼容对象类型:用
Get-ADObject代替Get-ADUser/Get-ADContact,可以同时处理用户和联系人对象,避免类型不匹配报错。 - 统一属性映射:AD用户的
Company/Surname/GivenName其实是原生属性company/sn/givenName的别名,联系人直接使用这些原生属性即可,无需区分对象类型;邮箱属性统一用原生mail(用户的EmailAddress本质也是映射到mail)。 - 容错处理:添加
try/catch捕获获取对象失败的情况,避免脚本中断,同时记录错误信息。 - 递归获取成员:
Get-ADGroupMember -Recursive会自动展开嵌套组内的成员,如果不需要递归,去掉-Recursive即可。
可选优化
如果确认所有联系人都正确设置了sn和givenName属性,可以简化属性映射部分,去掉CN拆分的逻辑:
[PSCustomObject]@{ Company = $adObj.company Surname = $adObj.sn GivenName = $adObj.givenName Email = $adObj.mail ObjectType = $adObj.ObjectClass }
内容的提问来源于stack exchange,提问作者Tom Davies
相关产品推荐
相关产品推荐

