In August of 2010, I posted Generating a report on Distribution Groups and their Membership. For most people, that script worked just fine.
However, it had some issues:
- Large groups would cause PowerShell to generate an error about concurrent pipelines
- The script generated string output instead of object output
This new version fixes those issues and adds ‘help’ content for the script. The script is below, but the information about the reasoning is copied directly from the original post, modified appropriately.
A common request is to get a list of all distribution groups and the members contained in that distribution group.
Note: a distribution group may also be a security group. From an Exchange Server perspective, the important thing is whether the group is mail-enabled or not.
You can take this report and pipe it to out-file in order to save the output to a disk file. Then you can inspect the file later, email it, copy-n-paste it, whatever you want. Export-Csv and Export-CliXml are also good options for exporting this data, especially since there is the potential for the contents of several arrays to be output.
Here is the script:
## ## Report-DistributionGroupsAndMembers.ps1 ## v2.0 ## ## Michael B. Smith ## http://TheEssentialExchange.com ## August, 2010 ## July, 2011 ## ## Requires the Exchange Management Shell ## As of version 2.0, requires PowerShell 2.0 ## Tested on both Exchange 2007 and Exchange 2010 ## #requires -Version 2.0 if( $args ) { if( ( $args.Length -eq 1 ) -and ( ( $args[0] -eq "-?" ) -or ( $args[0] -eq "-help" ) ) ) { @" NAME Report-DistributionGroupsAndMembers SYNOPSIS This script outputs information about all distribution groups. The information includes: GroupName - The name of the distribution group Identity - The unique identity of the group (an X400 identifier) ManagerNames - An array containing the names of the managers for the group. On Exchange 2007, this will contain a maximum of one entry. On Exchange 2010, there may be many entries. It is also possible (and quite likely in some environments), for this array to be empty. ManagerCanonicalNames - An array containing the canonical names (also known as the relative distinguished name) for the managers of this group. It will match, index by index, the contents of ManagerNames. Members - An array containing the names of all the members of this group. It is also possible for this array to be empty. This script must be executed from within an Exchange Management Shell. SYNTAX Report-DistributionGroupsAndMembers [-help] "@ | out-default return } throw "No parameters are allowed for this script" } $distributionGroups = Get-DistributionGroup -ResultSize Unlimited foreach( $distributionGroup in $distributionGroups ) { ## not all of these temporaries are necessary, but it ## simplifies understanding the PowerShell code $groupName = $distributionGroup.Name $groupID = $distributionGroup.Identity $managedBy = $distributionGroup.ManagedBy $mgrName = @() $mgrCName = @() if( $managedBy -is [Microsoft.Exchange.Data.Directory.ADObjectId] ) { $mgrName += $managedBy.Name $mgrCName += $managedBy.RDN.ToString().SubString(3) } elseif( $managedBy.Count -gt 0 ) { foreach( $manager in $managedBy ) { $mgrName += $manager.Name $mgrCName += $manager.RDN.ToString().SubString(3) } } $membersArray = @() $members = Get-DistributionGroupMember -Identity $groupID -ResultSize Unlimited foreach( $member in $members ) { $membersArray += $member.Name } $members = $null $hash = @{ GroupName = $groupName Identity = $groupID ManagerNames = $mgrName ManagerCanonicalNames = $mgrCName Members = $membersArray } New-Object PSObject -Property $hash ## inject to the pipeline } $distributionGroups = $null
Until next time…
If there are things you would like to see written about, please let me know.
Follow me on twitter! : @EssentialExch