Search code examples
powershellactive-directorywindows-scriptingadgroup

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


I need to merge two properties into one column, name of user is in DisplayName while Name of group is stored in Name how ever both types of objects has DisplayName, Name properties so I need to show them in one column.

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: 

I have tried using a for each looping but can't figure out the use of select statement.

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
    }
} 

The expected output need to be

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

Solution

  • I'd use a switch statement to process each item depending on if it is a user or group, and then replace the MemberName property depending on what it is:

    $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
    

    Or if you really want it all done in the pipeline you could do this:

    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