Combining Get-ADGroupMember with Get-User

Hi All,

We have an Office 365 / On Premise Exchange hybrid environment. We have an active directory group and I am looking for a way to know the members of the group have On Premise Mailbox or Office 365 Mailbox. Usually we run below AD Power Shell script to get the group members and then run the second Exchange Power Shell to know the recipient type. Is there any way to combine both and run a single script from Exchange Shell ?

Get-ADGroupMember -Identity “Group Name” | Get-ADObject -Properties Name, DisplayName | Select-Object Name, DisplayName | Export-Csv C:\Temp\List.csv -NoType

Get-Content “C:\Temp\List.csv” | Get-User | Select-Object Name, DisplayName, UserPrincipalName, WindowsEmailAddress, RecipientType | Export-Csv C:\Temp\UserExInfo.csv -NoTypeInformation

 

Thanks

Rajesh

Just ask AD for the groups with Get-ADGroup, or pass that name in manually of from a CSV, then pass the group by name to Get-ADGroupMember, then pass the member from the group by name to the Get-User and export as needed.

Clear-Host
# Get all groups 
(Get-ADGroup -Filter '*').SamAccountName | 
ForEach {
    # Process each group to get members
    "`n*** Process $PSItem group`n"
    ForEach($User in (Get-ADGroupMember -Identity $PSItem))
    {
        # Process each member to get mailbox user type and data
        Get-User -Identity $User.SamAccountName -ErrorAction SilentlyContinue | 
        Select-Object -Property RecipientTypeDetails, Name, DisplayName, UserPrincipalName
    }
} 
# Results
  RecipientTypeDetails Name                        DisplayName                  UserPrincipalName
  -------------------- ----                        -----------                  -----------------
*** Process Domain Users group

           UserMailbox Administrator               Administrator                Administrator@contoso.com
...
          DisabledUser krbtgt
...
...                                      
     RemoteUserMailbox ExoAdmin ServiceAccount     ExoAdmin ServiceAccount      exoadmin@contoso.com
...

Thanks a lot for the support. Since we are looking for only one group, i have shortened the script as below.

ForEach($User in (Get-ADGroupMember -Identity ADGroup)) {Get-User -Identity $User.SamAccountName -ErrorAction SilentlyContinue | Where RecipientTypeDetails -eq UserMailbox | Select-Object -Property Name, DisplayName, UserPrincipalName, WindowsEmailAddress }

But when i tried to export the results as CSV, I am getting below error.

ForEach($User in (Get-ADGroupMember -Identity ADGroup)) {Get-User -Identity $User.SamAccountName -ErrorAction SilentlyContinue | Where RecipientTypeDetails -eq UserMailbox | Select-Object -Property Name, DisplayName, UserPrincipalName, WindowsEmailAddress } | Export-Csv C:\Temp\UserExInfo-$(Get-Date -Format “ddMMMyyyy”).csv -NoTypeInformation

At line:1 char:281

  • … PrincipalName} | Export-Csv C:\Temp\UserExInfo-$(Get-Date -Format “ddMMMyyyy”).c …
  • ~
    An empty pipe element is not allowed.
  • CategoryInfo : ParserError: (:slight_smile: [], ParentContainsErrorRecordException
  • FullyQualifiedErrorId : EmptyPipeElement

 

Any idea whats wrong ?

 

Thanks

Rajesh

The ForEach loop, unfortunately, cannot pass objects down the pipeline. Try using a variable assignment for the ForEach loop then call the resultant variable and pipe to Export-Csv.

[pre]

$var=ForEach($x in $y){$x}

$var | Export-Csv path/to/csv

[/pre]

 

Thanks a lot, it worked.

I see you already got a follow-up, but with mine, it doe into matter how you collect your groups, as long as you pass just that name.

So, you could have just made one change.

# This way 

Clear-Host
# Use the selected group 
(Get-ADGroup -Filter '*').SamAccountName -eq 'Domain Users' | 
ForEach {
    # Process each group to get members
    "`n*** Process $PSItem group`n"
    ForEach($User in (Get-ADGroupMember -Identity $PSItem))
    {
        # Process each member to get mailbox user type and data
        Get-User -Identity $User.SamAccountName -ErrorAction SilentlyContinue | 
        Select-Object -Property RecipientTypeDetails, Name, DisplayName, UserPrincipalName
    }
}

# or this way ...

Clear-Host
# Use this group
'Domain Users' | 
ForEach {
    # Process each group to get members
    "`n*** Process $PSItem group`n"
    ForEach($User in (Get-ADGroupMember -Identity $PSItem))
    {
        # Process each member to get mailbox user type and data
        Get-User -Identity $User.SamAccountName -ErrorAction SilentlyContinue | 
        Select-Object -Property RecipientTypeDetails, Name, DisplayName, UserPrincipalName
    }
}