I had a situation to list all members of distribution group (DL) or security group to validate the members. Problem was the DL had other DLs as members. I had to write a quick script to list all members recursively.
If you have the same requirement of listing all members of a DL, feel free to use my script. It create a CSV file of the member list.
Make sure you connect to you Exchange environment first in PowerShell. It works Exchange Online and On-Prem Exchange servers.
<#
List-DLMembers.ps1
This script lists all members of a distribution list including all
child groups members recursively. It create a CSV file with all
groups of the given distribution group.
Parameter: Distribution group Alias or Name or Email Address
Example:
.\List-DLMembers.ps1 -DLName "NA-Sales"
#>
param($DLname)
<#
Function : Expand-Group
Parameter : Distribution Group Name
Description : This function populates all the members of the
given distribution group to a global variable named $Global:Users
#>
Function Expand-Group ($GroupName)
{
$members = Get-DistributionGroupMember -Identity $GroupName
foreach($member in $members)
{
$RecipientType = (Get-Recipient $member.Alias).RecipientType
$member.Name + "`t`t`t" + $RecipientType
if ($RecipientType -like "*DistributionGroup*")
{
# Found an child group - calling myself to expand the group
Expand-Group -GroupName $member.Alias
}
# Create a PSCustomObject of the current member
$MemberObject = [PSCustomObject] @{
Name = "$($member.Name)"
Title = "$($member.Title)"
Department = "$($member.Department)"
Email = "$($member.PrimarySMTPAddress)"
Memberof = "$GroupName"
}
# Store the member object to Users array
$global:users += $MemberObject
}
}
<#
End of the Function
#>
<#
°º¤ø,¸¸,ø¤º°`°º¤ø,¸,ø¤°º¤ø,¸¸,ø¤º°`°º¤ø,¸ °º¤ø,¸¸,ø¤º°`°º¤ø,¸,ø¤°º¤ø,¸¸,ø¤º°`°º¤ø,¸
THE SCRIPT STARTS HERE
°º¤ø,¸¸,ø¤º°`°º¤ø,¸,ø¤°º¤ø,¸¸,ø¤º°`°º¤ø,¸ °º¤ø,¸¸,ø¤º°`°º¤ø,¸,ø¤°º¤ø,¸¸,ø¤º°`°º¤ø,¸
#>
# Create a Global Array Variable to store all DL member objects
$global:users = @()
# Call the Expand-Group function to populate the all DL members
Expand-Group -GroupName $DLname
#Store the member objects to a CSV file
$filename = ".\$DLName-Members.csv"
$global:users | ConvertTo-Csv | Out-File -FilePath $filename
<#
°º¤ø,¸¸,ø¤º°`°º¤ø,¸,ø¤°º¤ø,¸¸,ø¤º°`°º¤ø,¸ °º¤ø,¸¸,ø¤º°`°º¤ø,¸,ø¤°º¤ø,¸¸,ø¤º°`°º¤ø,¸
END OF THE SCRIPT
°º¤ø,¸¸,ø¤º°`°º¤ø,¸,ø¤°º¤ø,¸¸,ø¤º°`°º¤ø,¸ °º¤ø,¸¸,ø¤º°`°º¤ø,¸,ø¤°º¤ø,¸¸,ø¤º°`°º¤ø,¸
#>
Thanks a lot Anand. You really save lot of time of my manual work. How we can run the script against the input file containing email address of DLs.