如何将 2 个属性合并到 AD 对象的单个输出中?

How to merge 2 properties into single output of AD Objects?

我需要将两个属性合并到一列中,用户名在 DisplayName 中,而组名存储在 Name 中,但是两种类型的对象都有 DisplayName、Name 属性,所以我需要在一列中显示它们。

Suppose Group is 'Test Group'

CN : …
ObjectGUID : 123-456-XXXX
ObjectClass: group
DisplayName: 
Name: 'Test Group'

And 'Test User' Properties are 
CN: …
ObjectGUID : 789-456-XXXX
ObjectClass: user
DisplayName: 'Test User'
Name: 

我试过使用 for each 循环,但无法弄清楚 select 语句的用法。

Get-ADGroupMember -Identity $GroupGUID | 
ForEach-Object{
    if($_.ObjectClass -eq 'User'){
        # process user object
        $_ | Get-ADUser -Properties DisplayName
    }elseif ($_.ObjectClass -eq 'User'){
        # process group
        $_ | Get-ADGroup -Properties Name
    }
} 

预期输出需要

MemberName          ObjectGUID
----------------    ------------------
Test Group          123-456-XXXX
Test User           789-456-XXXX

i 认为 您希望将源合并到一个输出对象中。

将多个来源的值添加到一个对象中的常用方法是使用 [PSCustomObject] 构建... 自定义对象。 [grin] 我没有任何 AD 访问权限,所以这是通过本地用户和组信息完成的。您可以通过计算要使用的内容并将其全部填充到一个结构整齐的对象中来进行一些相当复杂的结构化。

这是使用本地帐户的想法演示...

$GroupName = 'Homonymic_Tuu'

$MemberList = Get-LocalGroupMember -Group $GroupName |
    Where-Object {$_.ObjectClass -eq 'User'}
$GroupInfo = Get-LocalGroup -Name $GroupName

foreach ($ML_Item in $MemberList)
    {
    $UserInfo = Get-LocalUser -Name $ML_Item.Name.Split('\')[-1]
    if ([string]::IsNullOrEmpty($UserInfo.LastLogon))
        {
        $LastLogon = '_Never_'
        }
        else
        {
        $LastLogon = $UserInfo.LastLogon
        }
    [PSCustomObject]@{
        Group_Name = $GroupInfo.Name
        Group_Description = $GroupInfo.Description
        User_Name = $UserInfo.Name
        User_Description = $UserInfo.Description
        User_Enabled = $UserInfo.Enabled
        User_LastLogon = $LastLogon
        }
    }

截断输出...

Group_Name        : Homonymic_Tuu
Group_Description : Homonym - sounds like Tuu
User_Name         : 22
User_Description  : The Digit 2 Twice
User_Enabled      : True
User_LastLogon    : 2018-11-27 9:19:10 PM

[*...snip...*] 

Group_Name        : Homonymic_Tuu
Group_Description : Homonym - sounds like Tuu
User_Name         : TwoTwo
User_Description  : Repeating the name of the number after One.
User_Enabled      : True
User_LastLogon    : _Never_

数据也可以很容易地导出到 CSV 文件。 [咧嘴一笑]

我会使用 switch 语句来处理每个项目,具体取决于它是用户还是组,然后根据它是什么替换 MemberName 属性:

$Results = Switch(Get-ADGroupMember -Identity $GroupGUID){
    {$_.ObjectClass -eq 'User'} {$_ | Get-ADUser -Prop DisplayName | Select *,@{l='MemberName';e={$_.DisplayName}} -ExcludeProperty MemberName}
    {$_.ObjectClass -eq 'Group'} {$_ | Get-ADGroup | Select *,@{l='MemberName';e={$_.Name}} -ExcludeProperty MemberName}
}
$Results|Select MemberName,ObjectGUID

或者,如果您真的希望所有工作都在管道中完成,您可以这样做:

Get-ADGroupMember -Identity $GroupGUID -PipelineVariable 'Member' | ForEach{If($Member.ObjectClass -eq 'User'){$_ | Get-ADUser -Properties DisplayName}Else{$_ | Get-ADGroup}} | Select @{l='MemberName';e={If($Member.ObjectClass -eq 'User'){$_.DisplayName}Else{$_.Name}}},ObjectGUID