PowerShell查询被锁AD用户OU列返回空值问题求助
问题核心原因
你代码的问题是直接把*用户对象的完整可分辨名称(DN)*传给了Get-ADOrganizationalUnit的-Identity参数:
Search-ADAccount返回的用户对象的DistinguishedName属性格式为CN=用户名,OU=部门名,DC=域名,DC=后缀,这是用户本身的对象路径,不是所属OU的路径Get-ADOrganizationalUnit只能接收OU对象的DN作为入参,传入用户DN会触发查询不到对象的报错,AD模块默认静默处理这类报错,所以返回空值,导致OU列空白
修复方案
方法1:拆分用户DN提取OU路径
从用户DN中移除首个CN=xxx,段,剩下的部分就是用户所属父容器的DN,直接查询即可:
@(Search-ADAccount -LockedOut -UsersOnly) | Select-Object Name,SamAccountName,@{ Name="OU" Expression={ $parentDN = $_.DistinguishedName -replace '^CN=.*?,','' (Get-ADOrganizationalUnit -Identity $parentDN -ErrorAction SilentlyContinue).CanonicalName } }
如果需要兼容用户直接放在域根下的场景,可以补充异常判断:
@(Search-ADAccount -LockedOut -UsersOnly) | Select-Object Name,SamAccountName,@{ Name="OU" Expression={ $parentDN = $_.DistinguishedName -replace '^CN=.*?,','' try { (Get-ADOrganizationalUnit -Identity $parentDN).CanonicalName } catch { (Get-ADDomain).CanonicalName } } }
方法2:直接拆分CanonicalName属性(性能最优)
用户对象本身支持扩展查询CanonicalName属性,格式为域名/部门路径/用户名,直接去掉最后一段就是OU的规范名,不需要额外查询AD:
@(Search-ADAccount -LockedOut -UsersOnly -Properties CanonicalName) | Select-Object Name,SamAccountName,@{ Name="OU" Expression={ $parts = $_.CanonicalName.Split('/') $parts[0..($parts.Count-2)] -join '/' } }
内容的提问来源于stack exchange,提问作者TheStingPilot
相关产品推荐
相关产品推荐

