Public/Import/Import-EXOGroup.ps1

function Import-EXOGroup {
    <#
    .SYNOPSIS
    Import Office 365 Distribution Groups
 
    .DESCRIPTION
    Import Office 365 Distribution Groups
 
    .PARAMETER CSVFilePath
    CSV of new groups and attributes to create
 
    .PARAMETER ConvertSourceOnMicrosoftPrimaryToTarget
    CSV of new groups and attributes to create
 
    .EXAMPLE
    Import-EXOGroup -CSVFilePath .\importgroups.csv | Export-csv .\results.csv -nti
 
    .EXAMPLE
    Import-EXOGroup -CSVFilePath .\importgroups.csv -ConvertSourceOnMicrosoftPrimaryToTarget | Export-csv .\results.csv -nti
 
    .NOTES
    EmailAddresses excluded from import are all onmicrosoft.com addressess
    Included are all smtp addresses
    #>



    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory)]
        $CSVFilePath,

        [Parameter()]
        [switch]
        $ConvertSourceOnMicrosoftPrimaryToTarget
    )
    $GroupList = Import-Csv $CSVFilePath
    if ($ConvertSourceOnMicrosoftPrimaryToTarget) {
        $InitialDomain = (Get-AcceptedDomain | Where-Object { $_.InitialDomain }).DomainName
        $GroupList = $GroupList | Select-Object -ExcludeProperty PrimarySmtpAddress, WindowsEmailAddress @(
            @{
                Name       = 'PrimarySmtpAddress'
                Expression = { if (($_.PrimarySmtpAddress).split('@')[1] -like '*.onmicrosoft.com' ) {
                        '{0}@{1}' -f ($_.PrimarySmtpAddress).split('@')[0], $InitialDomain
                    }
                    else {
                        $_.PrimarySmtpAddress
                    }
                }
            }
            @{
                Name       = 'WindowsEmailAddress'
                Expression = { if (($_.WindowsEmailAddress).split('@')[1] -like '*.onmicrosoft.com' ) {
                        '{0}@{1}' -f ($_.WindowsEmailAddress).split('@')[0], $InitialDomain
                    }
                    else {
                        $_.WindowsEmailAddress
                    }
                }
            }
            '*'
        )
    }
    ForEach ($Group in $GroupList) {
        $newhash = @{
            Alias                              = $Group.Alias
            BypassNestedModerationEnabled      = [bool]::Parse($Group.BypassNestedModerationEnabled)
            DisplayName                        = $Group.DisplayName
            IgnoreNamingPolicy                 = $Group.IgnoreNamingPolicy
            MemberDepartRestriction            = $Group.MemberDepartRestriction
            MemberJoinRestriction              = $Group.MemberJoinRestriction
            ModerationEnabled                  = [bool]::Parse($Group.ModerationEnabled)
            Name                               = $Group.Name
            Notes                              = $Group.Notes
            PrimarySmtpAddress                 = $Group.PrimarySmtpAddress
            RequireSenderAuthenticationEnabled = [bool]::Parse($Group.RequireSenderAuthenticationEnabled)
            SendModerationNotifications        = $Group.SendModerationNotifications
        }
        $sethash = @{
            CustomAttribute1                  = $Group.CustomAttribute1
            CustomAttribute10                 = $Group.CustomAttribute10
            CustomAttribute11                 = $Group.CustomAttribute11
            CustomAttribute12                 = $Group.CustomAttribute12
            CustomAttribute13                 = $Group.CustomAttribute13
            CustomAttribute14                 = $Group.CustomAttribute14
            CustomAttribute15                 = $Group.CustomAttribute15
            CustomAttribute2                  = $Group.CustomAttribute2
            CustomAttribute3                  = $Group.CustomAttribute3
            CustomAttribute4                  = $Group.CustomAttribute4
            CustomAttribute5                  = $Group.CustomAttribute5
            CustomAttribute6                  = $Group.CustomAttribute6
            CustomAttribute7                  = $Group.CustomAttribute7
            CustomAttribute8                  = $Group.CustomAttribute8
            CustomAttribute9                  = $Group.CustomAttribute9
            HiddenFromAddressListsEnabled     = [bool]::Parse($Group.HiddenFromAddressListsEnabled)
            Identity                          = $Group.Identity
            ReportToManagerEnabled            = [bool]::Parse($Group.ReportToManagerEnabled)
            ReportToOriginatorEnabled         = [bool]::Parse($Group.ReportToOriginatorEnabled)
            SendOofMessageToOriginatorEnabled = [bool]::Parse($Group.SendOofMessageToOriginatorEnabled)
            SimpleDisplayName                 = $Group.SimpleDisplayName
            WindowsEmailAddress               = $Group.WindowsEmailAddress

        }
        $newparams = @{ }
        ForEach ($h in $newhash.keys) {
            if ($($newhash.item($h))) {
                $newparams.add($h, $($newhash.item($h)))
            }
        }
        $setparams = @{ }
        ForEach ($h in $sethash.keys) {
            if ($($sethash.item($h))) {
                $setparams.add($h, $($sethash.item($h)))
            }
        }
        $type = $Group.RecipientTypeDetails

        switch ( $type ) {
            MailUniversalDistributionGroup {
                $newparams['Type'] = "Distribution"
            }
            MailNonUniversalGroup {
                $newparams['Type'] = "Distribution"
            }
            MailUniversalSecurityGroup {
                $newparams['Type'] = "Security"
            }
            RoomList {
                $newparams['Roomlist'] = $true
            }
        }
        try {
            Write-Host "Creating group:`t $($Group.Name) - " -ForegroundColor Cyan
            $null = New-DistributionGroup @newparams -ErrorAction Stop
            Write-Host "SUCCESS NEW" -ForegroundColor Green
            $Target = $null
            while (-not $Target) {
                $Target = Get-DistributionGroup -Identity $Group.Name -ErrorAction SilentlyContinue | Select-Object *
                Start-Sleep -Seconds 2
            }
            [PSCustomObject]@{
                SourceName    = $Group.Name
                TargetName    = $Target.Name
                Action        = 'NEW'
                Item          = $Target.DisplayName
                Log           = 'SUCCESS'
                SourcePrimary = $Group.PrimarySmtpAddress
                TargetPrimary = $Target.PrimarySmtpAddress
                SourceGuid    = $Group.Guid
                TargetGuid    = $Target.Guid.ToString()
            }
        }
        catch {
            Write-Host "FAILED NEW" -ForegroundColor Red
            [PSCustomObject]@{
                SourceName    = $Group.Name
                TargetName    = ''
                Action        = 'NEW'
                Item          = $Group.Name
                Log           = $_.Exception.Message
                SourcePrimary = $Group.PrimarySmtpAddress
                TargetPrimary = ''
                SourceGuid    = $Group.Guid
                TargetGuid    = ''
            }
            continue
        }
        if ($Target) {
            try {
                Write-Host "Setting group:`t $($Group.Name) - " -ForegroundColor White -NoNewline
                Set-DistributionGroup @setparams -ErrorAction Stop
                Write-Host "SUCCESS SET" -ForegroundColor Green
                [PSCustomObject]@{
                    SourceName    = $Group.Name
                    TargetName    = $Target.Name
                    Action        = 'SET'
                    Item          = $Target.DisplayName
                    Log           = 'SUCCESS'
                    SourcePrimary = $Group.PrimarySmtpAddress
                    TargetPrimary = $Target.PrimarySmtpAddress
                    SourceGuid    = $Group.Guid
                    TargetGuid    = $Target.Guid.ToString()
                }
            }
            catch {
                Write-Host "FAILED SET" -ForegroundColor Red
                [PSCustomObject]@{
                    SourceName    = $Group.Name
                    TargetName    = $Target.Name
                    Action        = 'SET'
                    Item          = $Target.DisplayName
                    Log           = $_.Exception.Message
                    SourcePrimary = $Group.PrimarySmtpAddress
                    TargetPrimary = $Target.PrimarySmtpAddress
                    SourceGuid    = $Group.Guid
                    TargetGuid    = $Target.Guid.ToString()
                }
            }
            if ($Group.AcceptMessagesOnlyFrom) {
                try {
                    $Group.AcceptMessagesOnlyFrom -split [regex]::Escape('|') | ForEach-Object {
                        Write-Host "Set AcceptMessagesOnlyFrom:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -AcceptMessagesOnlyFrom @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $AcceptMessagesOnlyFrom = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'AcceptMessagesOnlyFrom'
                            Item          = $AcceptMessagesOnlyFrom
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
                catch {
                    Write-Host "FAILED" -ForegroundColor Red
                    [PSCustomObject]@{
                        SourceName    = $Group.Name
                        TargetName    = $Target.Name
                        Action        = 'AcceptMessagesOnlyFrom'
                        Item          = $AcceptMessagesOnlyFrom
                        Log           = $_.Exception.Message
                        SourcePrimary = $Group.PrimarySmtpAddress
                        TargetPrimary = $Target.PrimarySmtpAddress
                        SourceGuid    = $Group.Guid
                        TargetGuid    = $Target.Guid.ToString()
                    }
                }
            }
            if ($Group.AcceptMessagesOnlyFromDLMembers) {
                $Group.AcceptMessagesOnlyFromDLMembers -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set AcceptMessagesOnlyFromDLMembers:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -AcceptMessagesOnlyFromDLMembers @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $AcceptMessagesOnlyFromDLMembers = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'AcceptMessagesOnlyFromDLMembers'
                            Item          = $AcceptMessagesOnlyFromDLMembers
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'AcceptMessagesOnlyFromDLMembers'
                            Item          = $AcceptMessagesOnlyFromDLMembers
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.BypassModerationFromSendersOrMembers) {
                $Group.BypassModerationFromSendersOrMembers -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set BypassModerationFromSendersOrMembers:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -BypassModerationFromSendersOrMembers @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $BypassModerationFromSendersOrMembers = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'BypassModerationFromSendersOrMembers'
                            Item          = $BypassModerationFromSendersOrMembers
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'BypassModerationFromSendersOrMembers'
                            Item          = $BypassModerationFromSendersOrMembers
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.GrantSendOnBehalfTo) {
                $Group.GrantSendOnBehalfTo -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set GrantSendOnBehalfTo:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -GrantSendOnBehalfTo @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $GrantSendOnBehalfTo = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'GrantSendOnBehalfTo'
                            Item          = $GrantSendOnBehalfTo
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'GrantSendOnBehalfTo'
                            Item          = $GrantSendOnBehalfTo
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.ManagedBy) {
                $Group.ManagedBy -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set ManagedBy:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -ManagedBy @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $ManagedBy = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ManagedBy'
                            Item          = $ManagedBy
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ManagedBy'
                            Item          = $ManagedBy
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.ModeratedBy) {
                $Group.ModeratedBy -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set ModeratedBy:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -ModeratedBy @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $ModeratedBy = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ModeratedBy'
                            Item          = $ModeratedBy
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ModeratedBy'
                            Item          = $ModeratedBy
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.RejectMessagesFrom) {
                $Group.RejectMessagesFrom -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set RejectMessagesFrom:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -RejectMessagesFrom @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $RejectMessagesFrom = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'RejectMessagesFrom'
                            Item          = $RejectMessagesFrom
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'RejectMessagesFrom'
                            Item          = $RejectMessagesFrom
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.RejectMessagesFromDLMembers) {
                $Group.RejectMessagesFromDLMembers -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set RejectMessagesFromDLMembers:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -RejectMessagesFromDLMembers @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $RejectMessagesFromDLMembers = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'RejectMessagesFromDLMembers'
                            Item          = $RejectMessagesFromDLMembers
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'RejectMessagesFromDLMembers'
                            Item          = $RejectMessagesFromDLMembers
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.RejectMessagesFromSendersOrMembers) {
                $Group.RejectMessagesFromSendersOrMembers -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set RejectMessagesFromSendersOrMembers:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -RejectMessagesFromSendersOrMembers @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $RejectMessagesFromSendersOrMembers = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'RejectMessagesFromSendersOrMembers'
                            Item          = $RejectMessagesFromSendersOrMembers
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'RejectMessagesFromSendersOrMembers'
                            Item          = $RejectMessagesFromSendersOrMembers
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.ExtensionCustomAttribute1) {
                $Group.ExtensionCustomAttribute1 -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set ExtensionCustomAttribute1:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -ExtensionCustomAttribute1 @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $ExtensionCustomAttribute1 = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ExtensionCustomAttribute1'
                            Item          = $ExtensionCustomAttribute1
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ExtensionCustomAttribute1'
                            Item          = $ExtensionCustomAttribute1
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.ExtensionCustomAttribute2) {
                $Group.ExtensionCustomAttribute2 -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set ExtensionCustomAttribute2:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -ExtensionCustomAttribute2 @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $ExtensionCustomAttribute2 = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ExtensionCustomAttribute2'
                            Item          = $ExtensionCustomAttribute2
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ExtensionCustomAttribute2'
                            Item          = $ExtensionCustomAttribute2
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.ExtensionCustomAttribute3) {
                $Group.ExtensionCustomAttribute3 -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set ExtensionCustomAttribute3:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -ExtensionCustomAttribute3 @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $ExtensionCustomAttribute3 = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ExtensionCustomAttribute3'
                            Item          = $ExtensionCustomAttribute3
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ExtensionCustomAttribute3'
                            Item          = $ExtensionCustomAttribute3
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.ExtensionCustomAttribute4) {
                $Group.ExtensionCustomAttribute4 -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set ExtensionCustomAttribute4:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -ExtensionCustomAttribute4 @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $ExtensionCustomAttribute4 = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ExtensionCustomAttribute4'
                            Item          = $ExtensionCustomAttribute4
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ExtensionCustomAttribute4'
                            Item          = $ExtensionCustomAttribute4
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.ExtensionCustomAttribute5) {
                $Group.ExtensionCustomAttribute5 -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set ExtensionCustomAttribute5:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -ExtensionCustomAttribute5 @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ExtensionCustomAttribute5'
                            Item          = $ExtensionCustomAttribute5
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'ExtensionCustomAttribute5'
                            Item          = $ExtensionCustomAttribute5
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }
            if ($Group.MailTipTranslations) {
                $Group.MailTipTranslations -split [regex]::Escape('|') | ForEach-Object {
                    try {
                        Write-Host "Set MailTipTranslations:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -MailTipTranslations @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $MailTipTranslations = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'MailTipTranslations'
                            Item          = $MailTipTranslations
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'MailTipTranslations'
                            Item          = $MailTipTranslations
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }

            if ($Group.EmailAddresses) {
                ($Group.EmailAddresses -split [regex]::Escape('|') -match '(?i)x500:.*|smtp:.*@(?!(.*onmicrosoft\.com)).*') | ForEach-Object {
                    try {
                        Write-Host "Set EmailAddresses:`t $($_) - " -ForegroundColor White -NoNewline
                        Set-DistributionGroup -Identity $Group.Identity -emailaddresses @{Add = "$_" } -ErrorAction Stop
                        Write-Host "SUCCESS" -ForegroundColor Green
                        $EmailAddresses = $_
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'EmailAddresses'
                            Item          = $EmailAddresses
                            Log           = 'SUCCESS'
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                    catch {
                        Write-Host "FAILED" -ForegroundColor Red
                        [PSCustomObject]@{
                            SourceName    = $Group.Name
                            TargetName    = $Target.Name
                            Action        = 'EmailAddresses'
                            Item          = $EmailAddresses
                            Log           = $_.Exception.Message
                            SourcePrimary = $Group.PrimarySmtpAddress
                            TargetPrimary = $Target.PrimarySmtpAddress
                            SourceGuid    = $Group.Guid
                            TargetGuid    = $Target.Guid.ToString()
                        }
                    }
                }
            }

            # if ($Group.EmailAddresses) {
            # ($Group.EmailAddresses -split [regex]::Escape('|') -notmatch 'smtp:.*@(?!(.*onmicrosoft\.com|three\.com|four\.com)).*') | ForEach-Object {
            # Set-DistributionGroup -Identity $Group.Identity -emailaddresses @{Add = "$_" } -ErrorAction Stop
            # }
            # }

            # if ($Group.EmailAddresses) {
            # $Group.EmailAddresses -split [regex]::Escape('|') | Where-Object { !($_ -clike "SMTP:*") } | ForEach-Object {
            # Set-DistributionGroup -Identity $Group.Identity -emailaddresses @{Add = "$_" } -ErrorAction Stop
            # }
            # }

            if ($Group.x500) {
                try {
                    Write-Host "Set LegacyExchangeDNasX500:`t $($Group.x500) - " -ForegroundColor White -NoNewline
                    Set-DistributionGroup -Identity $Group.Identity -emailaddresses @{Add = $Group.x500 } -ErrorAction Stop
                    Write-Host "SUCCESS" -ForegroundColor Green
                    [PSCustomObject]@{
                        SourceName    = $Group.Name
                        TargetName    = $Target.Name
                        Action        = 'LegacyExchangeDNasX500'
                        Item          = $Group.x500
                        Log           = 'SUCCESS'
                        SourcePrimary = $Group.PrimarySmtpAddress
                        TargetPrimary = $Target.PrimarySmtpAddress
                        SourceGuid    = $Group.Guid
                        TargetGuid    = $Target.Guid.ToString()
                    }
                }
                catch {
                    Write-Host "FAILED" -ForegroundColor Red
                    [PSCustomObject]@{
                        SourceName    = $Group.Name
                        TargetName    = $Target.Name
                        Action        = 'LegacyExchangeDNasX500'
                        Item          = $Group.x500
                        Log           = $_.Exception.Message
                        SourcePrimary = $Group.PrimarySmtpAddress
                        TargetPrimary = $Target.PrimarySmtpAddress
                        SourceGuid    = $Group.Guid
                        TargetGuid    = $Target.Guid.ToString()
                    }
                }
                if ($Group.membersSMTP) {
                    $Group.membersSMTP -split [regex]::Escape('|') | ForEach-Object {
                        try {
                            Write-Host "Add Member:`t $($_) - " -ForegroundColor Yellow -NoNewline
                            Add-DistributionGroupMember -Identity $Group.Identity -member "$_" -ErrorAction Stop
                            Write-Host "SUCCESS" -ForegroundColor Green
                            $membersSMTP = $_
                            [PSCustomObject]@{
                                SourceName    = $Group.Name
                                TargetName    = $Target.Name
                                Action        = 'membersSMTP'
                                Item          = $membersSMTP
                                Log           = 'SUCCESS'
                                SourcePrimary = $Group.PrimarySmtpAddress
                                TargetPrimary = $Target.PrimarySmtpAddress
                                SourceGuid    = $Group.Guid
                                TargetGuid    = $Target.Guid.ToString()
                            }
                        }
                        catch {
                            Write-Host "FAILED" -ForegroundColor Red
                            [PSCustomObject]@{
                                SourceName    = $Group.Name
                                TargetName    = $Target.Name
                                Action        = 'membersSMTP'
                                Item          = $membersSMTP
                                Log           = $_.Exception.Message
                                SourcePrimary = $Group.PrimarySmtpAddress
                                TargetPrimary = $Target.PrimarySmtpAddress
                                SourceGuid    = $Group.Guid
                                TargetGuid    = $Target.Guid.ToString()
                            }
                        }
                    }
                }
            }
        }
    }
}