通过 Powershell 对 AD 对象的属性进行排序

Posted

技术标签:

【中文标题】通过 Powershell 对 AD 对象的属性进行排序【英文标题】:Sorting properties of an AD-object via Powershell 【发布时间】:2022-01-24 01:19:32 【问题描述】:

我正在尝试对 ActiveDirectory 计算机对象所属的组进行排序。要获取组列表,我使用以下代码(在本例中为 PC123):

Get-adcomputer 'PC123' -properties Memberof | Select-Object -ExpandProperty MemberOf

我得到以下输出,并且正如预期的那样,这些组没有排序:

CN=(A) Group3,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local
CN=(A) Group1,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local
CN=(A) Group4,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local
CN=(A) Group2,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local

我尝试使用Sort-Object进行排序:

Get-adcomputer 'PC215' -properties Memberof | Select-Object -ExpandProperty MemberOf | Sort-Object -Property Memberof

不幸的是,输出保持不变。我尝试通过更改Sort-Object -Property Memberof 的位置来愚弄一下,但这似乎不是问题。任何提示将不胜感激。

【问题讨论】:

试试Select-Object -ExpandProperty MemberOf @Olaf 这摆脱了外壳(谢谢),但列表仍未排序 但是去掉Sort-Object-Property Memberof 参数,成功了,这是为什么呢? 我明白了...我误解了管道。它从管道左侧获取“输出”并在右侧应用命令。 @Olaf 如果您愿意,请随时发布答案。 【参考方案1】:

您正在尝试根据不再存在的属性 (MemberOf) 对 array 进行排序,在这种情况下,您应该使用 -Property

以这个对象为例:

$computer = [pscustomobject]@
    Name     = 'PC215'
    MemberOf = @(
        'CN=(A) Group3,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
        'CN=(A) Group1,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
        'CN=(A) Group4,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
        'CN=(A) Group2,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
    )

PS /> $computer | Select-Object -Expand MemberOf | Sort-Object -Property MemberOf

CN=(A) Group3,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local
CN=(A) Group1,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local
CN=(A) Group4,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local
CN=(A) Group2,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local

PS /> $computer | Select-Object -Expand MemberOf | Sort-Object

CN=(A) Group1,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local
CN=(A) Group2,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local
CN=(A) Group3,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local
CN=(A) Group4,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local

值得添加来自official documentation 的这句话,因为它与问题有关:

如果命令中不包含排序属性,PowerShell 将使用第一个输入对象的默认排序属性。如果输入对象的类型没有默认排序属性,PowerShell 会尝试比较对象本身。

【讨论】:

是的,谢谢,只是我自己发现我误解了管道符号。非常感谢您的解释!我会给 olaf 一个机会写一个,因为他是第一个回答的。否则我接受你的。 换个说法,你为什么使用samAccountName 不只是为了本地帐户(据我记得)? @Albin 我在发布答案后看到了他的评论呵呵,据我所知,所有的 AD 对象都有一个 samAccountName 或者至少计算机有 有趣,根据here 的说法,DC 应该将其存储在 AD 数据库而不是 SAM 中,但无论如何这都是假设的......所以没关系。 @Albin 参考example 1,搜索属性。无论如何,我会在我的问题上更新它以避免混淆,呵呵

以上是关于通过 Powershell 对 AD 对象的属性进行排序的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell部署Server2016AD服务

PowerShell部署Server2016AD服务

AD属性修改 office 365 delivery management 设定

PowerShell Active Directory列出所有多值属性

AD用户属性对照表

Powershell 修改用户配置文件