Entra / Microsoft 365 · Exchange Online
Fix proxy email addresses
Fix up primary and proxy email addresses for mailboxes, groups, and distribution lists.
Connect & set up
Run these once per session. All scopes are read-only unless the script makes changes.
Connect-ExchangeOnline -ShowBanner:$false
Run it
The main script. Copy it, or download the .ps1 and run it from your console.
[array]$Modules = Get-Module -ListAvailable | Where-Object { $_.Name -eq "ExchangeOnlineManagement" }If (!$Modules) {Write-Host "Connecting to Exchange Online..."Connect-ExchangeOnline -ShowBanner:$false}[array]$Domains = Get-AcceptedDomain$PrimaryDomain = $Domains | Where-Object { $_.Default -eq $true } | Select-Object -ExpandProperty DomainName[array]$Domains = $Domains | Select-Object -ExpandProperty DomainNameWrite-Host "Checking mailboxes..."[array]$Mailboxes = Get-ExoMailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox, SharedMailbox, RoomMailbox, EquipmentMailbox, discoveryMailbox$Report = [System.Collections.Generic.List[Object]]::new()ForEach ($Mailbox in $Mailboxes) {$ExternalAddresses = $Mailbox.EmailAddresses | Where-Object { $_ -like "SMTP:*" -and ($_.Split(':')[1].Split('@')[1] -notin $Domains) }If ($ExternalAddresses) {$ReportLine = [PSCustomObject][Ordered]@{DisplayName = $Mailbox.DisplayNamePrimarySmtpAddress = $Mailbox.PrimarySmtpAddressEmailAddresses = $ExternalAddresses -join ", "Type = "mailbox"Identity = $Mailbox.Alias}$Report.Add($ReportLine)}}Write-Host "Checking Microsoft 365 Groups..."[array]$Groups = Get-UnifiedGroup -ResultSize UnlimitedForEach ($Group in $Groups) {$ExternalAddresses = $Group.EmailAddresses | Where-Object { $_ -like "SMTP:*" -and ($_.Split(':')[1].Split('@')[1] -notin $Domains) }If ($ExternalAddresses) {$ReportLine = [PSCustomObject][Ordered]@{DisplayName = $Group.DisplayNamePrimarySmtpAddress = $Group.PrimarySmtpAddressEmailAddresses = $ExternalAddresses -join ", "Type = "group"Identity = $Group.Alias}$Report.Add($ReportLine)}}Write-Host "Checking Distribution Lists..."[array]$DLs = Get-DistributionGroup -ResultSize UnlimitedForEach ($DL in $DLs) {$ExternalAddresses = $DL.EmailAddresses | Where-Object { $_ -like "SMTP:*" -and ($_.Split(':')[1].Split('@')[1] -notin $Domains) }If ($ExternalAddresses) {$ReportLine = [PSCustomObject][Ordered]@{DisplayName = $DL.DisplayNamePrimarySmtpAddress = $DL.PrimarySmtpAddressEmailAddresses = $ExternalAddresses -join ", "Type = "dl"Identity = $DL.Alias}$Report.Add($ReportLine)}}Write-Host "Checking Dynamic distribution groups..."[array]$DDLs = Get-DynamicDistributionGroup -ResultSize UnlimitedForEach ($DDL in $DDLs) {$ExternalAddresses = $DDL.EmailAddresses | Where-Object { $_ -like "SMTP:*" -and ($_.Split(':')[1].Split('@')[1] -notin $Domains) }If ($ExternalAddresses) {$ReportLine = [PSCustomObject][Ordered]@{DisplayName = $DDL.DisplayNamePrimarySmtpAddress = $DDL.PrimarySmtpAddressEmailAddresses = $ExternalAddresses -join ", "Type = "ddl"Identity = $DDL.Alias}$Report.Add($ReportLine)}}Write-Host ("{0} mailboxes, {1} groups, {2} distribution lists, and {3} dynamic distribution lists checked" -f $Mailboxes.Count, $Groups.Count, $DLs.Count, $DDLs.Count)Write-Host ("Problems found in {0} objects" -f $Report.Count)$Report | Format-Table -AutoSizeForEach ($Object in $Report) {$UpdatePrimary = $false$NewPrimarySmtpAddress = $null# Check if primary SMTP address needs to be updatedIf ($Object.PrimarySmtpAddress.Split('@')[1] -notin $Domains) {Write-Host ("Primary SMTP address must be updated from {0}" -f $Object.PrimarySmtpAddress)$NewPrimarySmtpAddress = ("{0}@{1}" -f $Object.PrimarySmtpAddress.Split('@')[0], $PrimaryDomain)$UpdatePrimary = $true}If ($UpdatePrimary) {Write-Host ("Setting new primary SMTP address {0}" -f $NewPrimarySmtpAddress)Switch ($Object.Type) {"mailbox" {Set-Mailbox -Identity $Object.Identity -EmailAddresses @{Remove=$Object.PrimarySmtpAddress; Add=$NewPrimarySmtpAddress} -ErrorAction SilentlyContinueSet-Mailbox -Identity $Object.Identity -WindowsEmailAddress $NewPrimarySmtpAddress -ErrorAction SilentlyContinue}"group" {Set-UnifiedGroup -Identity $Object.Identity -PrimarySmtpAddress $NewPrimarySmtpAddress -ErrorAction SilentlyContinue}"dl" {Set-DistributionGroup -Identity $Object.Identity -PrimarySmtpAddress $NewPrimarySmtpAddress -ErrorAction SilentlyContinue}"ddl" {Set-DynamicDistributionGroup -Identity $Object.Identity -PrimarySmtpAddress $NewPrimarySmtpAddress -ErrorAction SilentlyContinue}}}[array]$EmailAddresses = $Object.EmailAddresses -split ", "ForEach ($Address in $EmailAddresses) {If ($Address.Split('@')[1] -notin $Domains) {$AddressToRemove = $Address.Split(':')[1]Write-Host ("Removing address {0} from {1}" -f $Address, $Object.DisplayName)Switch ($Object.Type) {"mailbox" {Set-Mailbox -Identity $Object.Identity -EmailAddresses @{Remove=$AddressToRemove} -ErrorAction SilentlyContinue}"group" {Set-UnifiedGroup -Identity $Object.Identity -EmailAddresses @{Remove=$AddressToRemove} -ErrorAction SilentlyContinue}"dl" {Set-DistributionGroup -Identity $Object.Identity -EmailAddresses @{Remove=$AddressToRemove} -ErrorAction SilentlyContinue}"ddl" {Set-DynamicDistributionGroup -Identity $Object.Identity -EmailAddresses @{Remove=$AddressToRemove} -ErrorAction SilentlyContinue}}}}}Write-Host "All done"
Attribution
Author
Office365itpros