如何将AD组成员查询结果的DistinguishedName转换为Name/DisplayName
多域AD组成员查询:将DistinguishedName转换为Name/DisplayName
问题背景
需查询特定域内AD组的成员,成员(含用户、子组)可能来自不同域。当前脚本仅返回成员的DistinguishedName格式数据,需转换为Name或DisplayName属性。
当前脚本及输出
获取成员DN的脚本:
$grp = GROUPNAME1 $DNOUT = get-adgroup -identity $grp -properties member -server "DOMAIN.GROUP" | sort name | select-object -expandproperty member $DNOUT
执行输出:
CN=AC1,OU=F1,DC=d1,DC=domain,DC=group CN=GR30,OU=G4,DC=d3,DC=domain,DC=group CN=AC23,OU=F2,DC=dXF,DC=domain,DC=group CN=AC16,OU=F7,DC=d1,DC=domain,DC=group
尝试的方法及错误
尝试通过管道获取AD对象属性,但每个成员均触发**"Get-ADObject : 服务器返回了一个引用"**错误,脚本如下:
try { Get-ADgroup -Identity $grp -Properties member -Server "mydomain.com" | select -object -Expand Member | Get-ADObject -Properties * | Sort-Object Name | select Name } catch { $_.Exception.Referral }
解决方案
跨域查询时Get-ADObject默认不自动跟随引用,需通过以下两种方式处理:
方法1:使用全局编录查询
全局编录(默认端口3268)可查询整个AD林内的对象,无需逐个解析域,效率更高:
$grp = "GROUPNAME1" # 指定全局编录服务器(格式:域名:3268) $globalCatalog = "DOMAIN.GROUP:3268" # 获取组成员DN列表 $memberDNs = Get-ADGroup -Identity $grp -Properties member -Server "DOMAIN.GROUP" | Select-Object -ExpandProperty member # 遍历查询每个成员的Name属性 foreach ($dn in $memberDNs) { try { Get-ADObject -Identity $dn -Properties Name, ObjectClass -Server $globalCatalog | Select-Object Name, ObjectClass } catch { Write-Warning "无法查询对象 $dn : $_" } }
方法2:从DN解析域并指定对应服务器
若不想用全局编录,可从DN中提取域组件,拼接成对应域的服务器地址:
$grp = "GROUPNAME1" $memberDNs = Get-ADGroup -Identity $grp -Properties member -Server "DOMAIN.GROUP" | Select-Object -ExpandProperty member foreach ($dn in $memberDNs) { # 从DN中提取DC段,拼接成域服务器地址 $domainComponents = ($dn -split ",DC=" | Where-Object { $_ -match '\w+' }) -join "." $domainServer = $domainComponents try { Get-ADObject -Identity $dn -Properties Name, DisplayName -Server $domainServer | Select-Object Name, DisplayName, ObjectClass } catch { Write-Warning "无法查询对象 $dn : $_" } }
关键提示
- 避免使用
-Properties *,仅指定需要的属性(如Name、DisplayName)可大幅提升查询速度。 - 加入错误捕获可跳过无效对象,防止脚本中断。
内容的提问来源于stack exchange,提问作者jonas
相关产品推荐
相关产品推荐

