首页 > 解决方案 > 如何返回按属性名称过滤的 powershell 对象属性通配符?

问题描述

我正在尝试使用 Get-ADUser 查找我不知道其名称的特定扩展属性。在我的组织中,每个 AD 用户都应该有一个属性字段,指定他们是否接受过某个主题的培训,但我不知道该字段的确切名称。所以我希望搜索名称中可能包含特定字符串的属性,例如“titleIX”。

下面的代码不像我想要的那样工作(显然),但我希望它说明了我正在寻找的内容: Get-ADUser -filter 'name -like "johndoe"' -properties * | Where-Object {$_.propertyname -like "*titleIX*"}

在这个例子中,希望输出看起来像这样 trngTitleIXDone: Yes 。那时我会知道该字段被称为“trngTitleIXDone”,并且可以继续以我快乐的方式将它用于我想要生成的实际报告。

我意识到我可能需要进一步的管道命令来实现我正在寻找的实际过滤,而不仅仅是与具有与查询匹配的名称的属性的对象关联的属性的完整列表。

谢谢,如果我需要更好地解释自己,请告诉我。== 马特

PS 应要求提供更多上下文:

问:你不能问你的管理员,或者在 ADUC 中找到它吗?
A:这个组织很大,有很多没有记录的自定义属性(以我可以访问的方式)。获取这些信息,甚至找到合适的人来询问,都比自己找到要花更长的时间。而且我想知道这个技能,以防再次出现,这样我下次就可以避免耽搁了。

至于 ADUC,我不确切知道何时返回属性背后的逻辑,但我的理解是,我正在寻找的属性具有某种分类,除非您特别指出,否则它们不会被返回按名称定位他们。简单地使用properties *不会返回我正在寻找的内容,并且 ADUC 中列出的属性或多或少是相同的数据集。

标签: powershellfilterproperties

解决方案


最后,我们发现我问错了问题,因为自定义 AD 属性如何工作的奥秘细节,我并不完全理解。感谢@LotPings、@Theo 和@TheMadTechnician 的评论阐明了不同的可能性。

正如所问的那样,@Lee_Dailey 关于 PSObjects (.PSObject) 的隐藏属性、其子属性(.Properties及其子属性.Name、.Value 等)的评论可能最准确地回答了这个问题。虽然我目前没有一个可行的答案,但我确信有一种编程方式可以使用它们来迭代给定对象的未知属性。

至于我的问题,我不能轻易返回要迭代的属性列表,主要有两个原因:

1) 即使从 Get-AD* cmdlet(例如Get-ADUser -filter 'name -like "johndoe"' -properties *)请求所有属性,也只会返回具有非空(即未设置)值的属性(即属性)。AD 永远不会为给定对象返回此类属性,因为它们在对象中不存在。要返回模式中可用但在给定对象中未使用的可能属性列表,您必须(显然)查询模式本身。

查询架构以获取可能的属性:

Select-Object @{n="Attributes";e={$_.maycontain + $_.systemmaycontain}} | 
Select-Object -ExpandProperty Attributes |
Sort-Object

资料来源:
https ://social.technet.microsoft.com/Forums/windowsserver/en-US/8da2aa4e-5ae6-47d9-ac1b-159e5e3f2612/pull-all-user-attributes-with-powershell?forum=winserverpowershell (感谢@LotPings)
https://blogs.technet.microsoft.com/poshchap/2017/09/22/one-liner-query-the-ad-schema-for-user-object-attributes/(感谢@Theo)

2) 显然,即使是为对象设置但自定义的属性(即不是默认或扩展属性集的一部分)也永远不会返回,除非您按名称请求它们。从 Get-ADUser 的详细帮助文件中:
To specify an individual extended property, use the name of the property. For properties that are not default or extended properties, you must specify the LDAP display name of the attribute.

在我的情况下,似乎甚至(至少一些) org-custom 属性实际上是由 requesting 返回的-properties *,这让我认为,在我的环境中,它们已经以某种方式被专门配置为扩展集的一部分,如果那是可能的。如果是这种情况,可能有一些自定义属性没有以这种方式配置,这将使得很难知道哪些模式可用的属性可能设置在对象上,但需要通过名称请求. 为了确定这一点,我可以遍历可能的属性,请求所有属性,并将结果与​​扩展集进行比较。


推荐阅读