为什么Get-Member无法显示ADUser对象的全部可用属性
问题描述
我需要查询ADUser的所有可用属性,运行如下命令:
Get-ADUser -Filter * -Properties * | Get-Member -MemberType properties | Where-Object {$_.name -eq 'ipPhone'}
执行后未返回任何结果,看起来ADUser不存在ipPhone属性,但该属性实际存在,可通过如下命令验证:
Get-ADUser -Filter * -Properties * | select ipPhone
请问为什么Get-Member无法展示ADUser的全部属性?
问题解答
这是Active Directory PowerShell模块返回的ADUser对象的特殊机制,以及Get-Member的工作逻辑共同导致的,核心原因有两点:
ADUser的非核心属性(比如自定义扩展属性、未赋值的AD内置属性)都属于动态扩展属性,不会作为.NET类型的固定属性预先定义。AD模块返回对象时,默认只会给对象实例挂载有赋值的扩展属性,如果某个AD属性在你管道传输的第一个ADUser对象上是空值,这个属性就不会被挂载到该实例的顶层属性列表里。Get-Member枚举属性时,只会参考管道输入的第一个对象的属性结构,不会合并后续所有输入对象的属性。如果第一个对象没有挂载ipPhone属性,后续哪怕其他对象有这个属性,Get-Member也不会识别到。
你用Select-Object ipPhone能正常返回结果,是因为Select-Object会遍历每一个输入对象,直接到每个对象的内置Properties集合里查找对应属性,就算属性没有挂载到实例顶层也能读取到值,空值就返回空结果而已。
正确查询所有ADUser可用属性的方法
方法1:直接读取AD架构(最准确,不会遗漏属性)
读取AD架构中User类的所有强制属性和可选属性,不管现有用户有没有赋值都能查到:
Get-ADObject -SearchBase (Get-ADRootDSE).SchemaNamingContext -Filter {name -eq "user"} -Properties mayContain,mustContain | Select-Object @{Name="AllUserProperties";Expression={$_.mayContain + $_.mustContain}} | Format-List
方法2:基于现有用户对象枚举所有出现过的属性
先把所有用户对象存到变量里,合并所有对象的属性后再筛选:
# 拉取所有用户的所有属性 $allUsers = Get-ADUser -Filter * -Properties * # 合并所有用户的属性名去重 $allPropNames = $allUsers | ForEach-Object {$_.PSObject.Properties.Name} | Select-Object -Unique # 筛选你要查的属性 $allPropNames | Where-Object {$_ -eq "ipPhone"}
内容的提问来源于stack exchange,提问作者bigapple99
相关产品推荐
相关产品推荐

