如何修改PowerShell脚本获取AD组成员的DisplayName而非用户名
解决AD组成员DisplayName提取问题
嘿,我来帮你搞定这个需求!你的现有脚本只是通过正则从AD组的members属性里提取了CN(也就是用户名),但要拿到成员的DisplayName,得实际去查询每个成员对应的AD对象才行——毕竟members里存的只是成员的完整DN(区分名),并没有直接存储DisplayName信息。
我给你调整了脚本,不仅能正确获取成员的DisplayName,还优化了一些细节避免报错:
# 先定义日期变量,确保生成的CSV文件名不会重复覆盖 $currentdate = Get-Date -Format "yyyyMMdd" # 读取CSV里的AD组列表,逐个处理每组信息 Get-Content "C:\temp\glist.csv" | ForEach-Object { # 获取目标AD组的核心属性:名称、描述、成员列表 $targetGroup = Get-ADGroup -Identity $_ -Properties Name, Description, Members # 遍历组内每个成员的DN,查询对应的DisplayName $memberNames = $targetGroup.Members | ForEach-Object { try { # 用Get-ADObject兼容所有AD对象类型(用户、组、计算机等) (Get-ADObject -Identity $_ -Properties DisplayName).DisplayName } catch { # 遇到无效成员DN时,返回提示信息,避免脚本中断 "[无法获取该成员信息: $_]" } } # 组装要导出的对象 [PSCustomObject]@{ Name = $targetGroup.Name Description = $targetGroup.Description Members = $memberNames -join "; " } } | Export-Csv "C:\temp\group_info_$currentdate.csv" -NoTypeInformation -Encoding UTF8
关键修改点说明:
- 新增日期变量定义:你的原脚本里用了
$currentdate但没初始化,我加了Get-Date生成格式化日期,避免每次运行覆盖旧文件。 - 替换成员提取逻辑:不再用正则截取CN,而是通过
Get-ADObject查询每个成员DN对应的AD对象,直接获取DisplayName属性,结果更准确。 - 兼容多类型成员:用
Get-ADObject而非Get-ADUser,因为AD组的成员可能包含其他组、计算机等对象,这样所有类型的成员都能获取到DisplayName。 - 增加错误处理:加入
try/catch块,就算遇到无效的成员DN(比如已被删除的对象),脚本也不会中断,而是返回提示信息。
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

