Migrate Distribution Groups and Members between 365 Tenants and settings

Alex has already done the hard work for this which works well

Exchange Online Distribution List Migration Script | A blog about automation and technologies in the cloud (alexholmeset.blog)

I changed the script as the Source tenant had multiple domains and also stoped 365 Groups with the same name causing issues

#Connect with source tenant

#Connect with destination tenant

#Dist Groups list in array "1","2"
$DL = "1","2"

$ZSourceDomain = "sourcedomain.com"
$CSourceDomain = "sourcedomain2.com"
$DestinationDomain = "destinationdomain3.com"

foreach($D in $DL){
   $List = @()
   $List = Get-AzureADGroup -SearchString "$D"
   #Remove office 365 Groups with same name , using SPO as identifier
   $List = $list | ?{$_.proxyaddresses -match '.*SPO.*'}
   $ZListMembers = @()
   $ZListMembers = Get-AzureADGroupMember -ObjectId $List.ObjectId | Where-Object {$_.UserPrincipalName -like '*$ZSourceDomain'}

   $ZListMembersUPN = @()
   $ZListMembersUPN = $ZListMembers.UserPrincipalName

   $CListMembers = @()
   $CListMembers = Get-AzureADGroupMember -ObjectId $List.ObjectId | Where-Object {$_.UserPrincipalName -like '*$CSourceDomain'}

   $CListMembersUPN = @()
   $CListMembersUPN = $CListMembers.UserPrincipalName

   New-DistributionGroup -Name $List.DisplayName -Description $List.Description -PrimarySmtpAddress $($List.MailNickName+"@$DestinationDomain")
   foreach($ZListMemberUPN in $ZListMembersUPN){
        Add-DistributionGroupMember -Identity $List.DisplayName -Member $ZListMemberUPN.replace("$ZSourceDomain","$DestinationDomain")
   foreach($CListMemberUPN in $CListMembersUPN){
        Add-DistributionGroupMember -Identity $List.DisplayName -Member $CListMemberUPN.replace("$CSourceDomain","$DestinationDomain")



Lets Export all Distribution settings from Source Tenant 

#Connect with source tenant

Get-DistributionGroup -RecipientTypeDetails MailUniversalDistributionGroup | Export-Csv -Path “C:\Temp\dGroupsall.csv"

Lets Import and Set what we need to the Destination Tenant

This script does RequireSenderAuthenticationEnabled ( Delivery Restrictions )  , Owner ( ManagedBy ) and MemberJoinRestriction. You can add any new ones you would like to set from the Sheet


#Connect with destination tenant

Import-Csv -Path "C:\Temp\dGroupsall.csv" | ForEach-Object {

#Lets do this one by one incase one fails it doesn't block other 

	#We need to convert the csv value to boolean to write to RequireSenderAuthenticationEnabled
	[boolean] $RequireSenderAuthenticationEnabled = [system.convert]::toboolean($_.RequireSenderAuthenticationEnabled)
	Set-DistributionGroup -Identity $_.Alias -RequireSenderAuthenticationEnabled $RequireSenderAuthenticationEnabled
	Set-DistributionGroup -Identity $_.Alias -ManagedBy $_.ManagedBy 
	Set-DistributionGroup -Identity $_.Alias -MemberJoinRestriction $_.MemberJoinRestriction

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)