如何提取AD用户DistinguishedName中的指定OU段并格式化输出?
解决AD用户查询中OU列为空并自定义格式的问题
问题原因
AD用户对象并没有名为OU的内置属性,你之前在$ADExtProps里指定的OU是无效的,所以Get-ADUser无法获取对应数据,导致输出的OU列显示为空的{}。
解决方案
要实现「(子OU名称) under (父OU名称)」的格式,需要从用户的DistinguishedName属性中解析OU层级信息,通过计算属性生成自定义的OU列内容。
完整代码示例
# 指定需要获取的基础属性,DistinguishedName用于解析OU信息 $ADProps = @('Enabled', 'SamAccountName') Get-ADUser -Filter * -SearchBase $TestOU -Properties $ADProps | Select-Object Enabled, SamAccountName, @{ Name = 'OU' Expression = { # 拆分DistinguishedName,提取所有OU段 $ouSegments = $_.DistinguishedName -split ',' | Where-Object { $_ -like 'OU=*' } switch ($ouSegments.Count) { 0 { 'No OU' } 1 { $ouName = $ouSegments[0] -replace '^OU=', '' "($ouName)" } default { $childOU = $ouSegments[0] -replace '^OU=', '' $parentOU = $ouSegments[1] -replace '^OU=', '' "($childOU) under ($parentOU)" } } } } | Format-Table -AutoSize -Wrap
代码说明
- 属性获取:
DistinguishedName是Get-ADUser默认返回的属性,无需额外指定;如果需要确保获取到,也可以加入$ADProps数组。 - 计算属性逻辑:
- 按逗号拆分
DistinguishedName,筛选出所有以OU=开头的段落,这些就是用户所在的OU层级(最靠近用户的OU排在最前面)。 - 根据OU段的数量分支处理:
- 没有OU段时,显示
No OU(用户直接在域根节点)。 - 只有一个OU段时,直接显示该OU名称。
- 两个及以上OU段时,提取第一个(子OU)和第二个(父OU),格式化为要求的字符串。
- 没有OU段时,显示
- 按逗号拆分
执行这段代码后,OU列会按照你需要的格式显示内容,不再是空值。
内容的提问来源于stack exchange,提问作者menoskyz
相关产品推荐
相关产品推荐

