Public/Group/Unified/Export-AndImportUnifiedGroups.ps1

function Export-AndImportUnifiedGroups {
    <#
.SYNOPSIS
Export, Import, and update Unfied Groups
 
.DESCRIPTION
Use this script to backup, restore, export, import, and update Unified Groups,
primarily when migrating group settings between tenants.
 
In a 1-stage migration, you will export unified groups from a source tenant,
add the domains to the target tenant, and then import the groups with users into
the target tenant. To do this, you'll use the -Mode Import -IncludeUsers
parameters when importing into the target tenant.
 
In a 2-stage migration, you will export unified groups from a source tenant,
import the groups to the target tenant, synchronize the data, and then add the
domains at a later date. Once the domains are added, you can re-run the script
with the -Mode Set parameter to import the users.
 
.PARAMETER IncludeUsers
When running an Import, if the domains have been migrated, use this switch to
import the users as well.
 
.PARAMETER Mode
Valid options are Export, Import, and Set.
- Export
  Use when exporting Unified Groups. Converts objects/aliases to fully-qualified
  SMTP Addresses.
 
- Import
  Use when importing Unified Groups. If domains haven't been moved between
  source and target during a migration, do nothing. If domains have been moved,
  use the "IncludeUsers" switch.
 
- Set
  If performing a 2-stage migration (pre-create groups so content can be staged
  and then moving domains), run this param after the domains have been migrated
  to add the users back to the groups.
 
.PARAMETER RewriteTargetDomain
Use this switch to update the target domain address for users. You can use this
with any mode (Export, Import, Set) to update the SMTP suffix of the users that
will be added back to groups. Useful if you are performing a tenant to tenant
migration but not keeping the same address space (such as a divestiture).
 
.EXAMPLE
Export-AndImportUnifiedGroups -Mode Export -File MyUnifiedGroups.csv
Export unified groups.
 
.EXAMPLE
Export-AndImportUnifiedGroups -Mode Import -File MyUnifiedGroups.Csv -IncludeUsers
Import unified groups in a 1-stage migration (imports groups and users together)
 
.EXAMPLE
Export-AndImportUnifiedGroups -Mode Import -File MyUnifiedGroups.csv
Import unified groups in a 2-stage migration (import groups first, import users
later in a second pass).
 
.EXAMPLE
Export-AndImportUnifiedGroups -Mode Set -File MyUnifiedGroups.csv
Import users and set additional properties of previously imported Unified Groups.
 
.EXAMPLE
Export-AndImportUnifiedGroups -IncludeUsers -Mode Import -File MyUnifiedGroups.csv -RewriteTargetDomain -SourceDomain contoso.com -TargetDomain fabrikam.com
Import users while rewriting source domain from contoso.com to fabrikam.com in a
single-pass (1 stage) migration. Use this when migrating Office 365 groups but not
preserving the domain name (such as in a divestiture scenario).
 
.LINK
Credit
Aaron Guilmette
https://gallery.technet.microsoft.com/Export-and-Import-Unified-e73d82ba
 
.NOTES
2017-10-27 - Fixed typo for Owners.
2017-10-25 - Fixed parameter typos.
            - Updated import/set processing to check recipients prior to processing
              and remove users that aren't valid recipients in the tenant.
#>

    param (
        [Parameter()]
        [string]
        $File,

        [Parameter()]
        [switch]
        $IncludeUsers,

        [Parameter()]
        [validateset('Export', 'Import', 'Set')]
        $Mode,

        [Parameter(ParameterSetName = "Rewrite")]
        [switch]
        $RewriteTargetDomain,

        [Parameter()]
        [string]
        $SourceDomain,

        [Parameter()]
        [string]
        $TargetDomain
    )

    end {

        $Selectproperties1 = @(
            'Alias', 'Name', 'DisplayName', 'AccessType'
        )

        $Selectproperties2 = @(
            'AllowAddGuests', 'AlwaysSubscribeMembersToCalendarEvents', 'AutoSubscribeNewMembers', 'BypassModerationFromSendersOrMembers'
            'CalendarMemberReadOnly', 'CalendarUrl', 'Classification', 'ConnectorsEnabled', 'CustomAttribute1', 'CustomAttribute2'
            'CustomAttribute3', 'CustomAttribute4', 'CustomAttribute5', 'CustomAttribute6', 'CustomAttribute7', 'CustomAttribute8'
            'CustomAttribute9', 'CustomAttribute10', 'CustomAttribute11', 'CustomAttribute12', 'CustomAttribute13', 'CustomAttribute14'
            'CustomAttribute15', 'ExchangeObjectId'
        )

        $Selectproperties3 = @(
            'EmailAddressPolicyEnabled', 'ExtenstionCustomAttribute1', 'ExtenstionCustomAttribute2', 'ExtenstionCustomAttribute3'
            'ExtenstionCustomAttribute4', 'ExtenstionCustomAttribute5', 'FileNotificationsSettings'
        )

        $Selectproperties4 = @(
            'HiddenFromAddressListsEnabled', 'HiddenGroupMembershipEnabled', 'InboxUrl', 'MailboxProvisioningConstraint'
        )
        $Selectproperties5 = @(
            'MaxReceiveSize', 'MaxSendSize'
        )
        $Selectproperties6 = @(
            'ModerationEnabled', 'Notes', 'PeopleUrl', 'PhotoUrl', 'PrimarySmtpAddress', 'ProvisioningOption'
        )
        $Selectproperties7 = @(
            'ReportToManagerEnabled', 'RequireSenderAuthenticationEnabled', 'SendModerationNotifications'
            'SendOofMessageToOriginatorEnabled', 'SharePointDocumentsUrl', 'SharePointNotebookUrl'
            'SharePointSiteUrl', 'SubscriptionEnabled', 'WelcomeMessageEnabled', 'YammerEmailAddress'
        )
        $CalculatedProps1 = @(
            @{N = "AcceptMessagesOnlyFrom"; E = { $AcceptMessagesOnlyFrom -join "," } },
            @{N = "AcceptMessagesOnlyFromDLMembers"; E = { $AcceptMessagesOnlyFromDLMembers -join "," } },
            @{N = "AcceptMessagesOnlyFromSendersOrMembers"; E = { $AcceptMessagesOnlyFromSendersOrMembers -join "," } }
        )

        $CalculatedProps2 = @(
            @{N = "EmailAddresses"; E = { $_.EmailAddresses -join "," } }
        )

        $CalculatedProps3 = @(
            @{N = "GrantSendOnBehalfTo"; E = { $GrantSendOnBehalfTo -join "," } }
        )

        $CalculatedProps4 = @(
            @{N = "ManagedBy"; E = { $ManagedBy -join "," } },
            @{N = "ManagedByDetails"; E = { $ManagedByDetails -join "," } },
            @{N = "Members"; E = { $Members -join "," } },
            @{N = "Owners"; E = { $Owners -join "," } },
            @{N = "Subscribers"; E = { $Subscribers -join "," } },
            @{N = "Aggregators"; E = { $Aggregators -join "," } }
        )
        $CalculatedProps5 = @(
            @{N = "ModeratedBy"; E = { $ModeratedBy -join "," } }
        )

        $CalculatedProps6 = @(
            @{N = "RejectMessagesFrom"; E = { $RejectMessagesFrom -join "," } },
            @{N = "RejectMessagesFromDLMembers"; E = { $RejectMessagesFromDLMembers -join "," } },
            @{N = "RejectMessagesFromSendersOrMembers"; E = { $RejectMessagesFromSendersOrMembers -join "," } }
        )
        If ($RewriteTargetDomain -and -not $SourceDomain -and -not $TargetDomain) {
            Write-Host -ForegroundColor Red "You cannot specify RewriteTargetDomain without specifying SourceDomain and TargetDomain parameters."
            Break
        }

        # Functions
        # The ReWriteTargetDomain switch is used for rewriting the target domain between
        # source and target environments. It is a simple find/replace in the input or
        # output file. The ReWriteExoprt function operates on the original export before
        # it's written out to disk, and the ReWriteImport function creates a temporary
        # file while leaving the original export alone.
        function ReWriteExport($File, $SourceDomain, $TargetDomain) {
            (Get-Content $File) -replace $SourceDomain, $TargetDomain | Set-Content $File
        }

        function ReWriteImport($File, $SourceDomain, $TargetDomain) {
            $global:TempFile = "TempImport_" + (Get-Date -Format yyyymmddhhmmss) + ".csv"
            (Get-Content $File) -replace $SourceDomain, $TargetDomain | Set-Content $TempFile
        }

        Switch ($Mode) {
            Export {
                $UnifiedGroups = Get-UnifiedGroup -ResultSize Unlimited
                $Count = $UnifiedGroups.Count
                $i = 1
                foreach ($Group in $UnifiedGroups) {
                    Write-Host "$($Group.Name) [$i of $Count]"
                    $Sub = Get-UnifiedGroupLinks -Identity $Group.Identity -LinkType Subscribers
                    $Mem = Get-UnifiedGroupLinks -Identity $Group.Identity -LinkType Members
                    $Own = Get-UnifiedGroupLinks -Identity $Group.Identity -LinkType Owners
                    $Agg = Get-UnifiedGroupLinks -Identity $Group.Identity -LinkType Aggregators

                    # Resolve GrantSendOnBehalfTo
                    $GrantSendOnBehalfTo = @()
                    foreach ($addr in $Group.GrantSendOnBehalfTo) { $GrantSendOnBehalfTo += (Get-Recipient $addr -ErrorAction SilentlyContinue).PrimarySmtpAddress }

                    #Resolve ManagedBy
                    $ManagedBy = @()
                    foreach ($addr in $Group.ManagedBy) { $ManagedBy += (Get-Recipient $addr -ErrorAction SilentlyContinue).PrimarySmtpAddress }

                    # Resolve ManagedByDetails
                    $ManagedByDetails = @()
                    foreach ($addr in $Group.ManagedByDetails) { $ManagedByDetails += (Get-Recipient $addr -ErrorAction SilentlyContinue).PrimarySmtpAddress }

                    # Resolve Members
                    $Members = @()
                    foreach ($addr in $Mem) { $Members += $addr.PrimarySmtpAddress }

                    # Resolve Subscribers
                    $Subscribers = @()
                    foreach ($addr in $Sub) { $Subscribers += $addr.PrimarySmtpAddress }

                    # Resolve Aggregators
                    $Aggregators = @()
                    foreach ($addr in $Agg) { $Aggregators += $addr.PrimarySmtpAddress }

                    # Resolve Owners
                    $Owners = @()
                    foreach ($addr in $Own) { $Owners += $addr.PrimarySmtpAddress }

                    # Resolve ModeratedBy
                    $ModeratedBy = @()
                    foreach ($addr in $Group.ModeratedBy) { $ModeratedBy += (Get-Recipient $addr -ErrorAction SilentlyContinue).PrimarySmtpAddress }

                    # Resolve RejectMessagesFrom
                    $RejectMessagesFrom = @()
                    foreach ($addr in $Group.RejectMessagesFrom) { $RejectMessagesFrom += (Get-Recipient $addr -ErrorAction SilentlyContinue).PrimarySmtpAddress }

                    # Resolve RejectMessagesFromSendersOrMembers
                    $RejectMessagesFromSendersOrMembers = @()
                    foreach ($addr in $Group.RejectMessagesFromSendersOrMembers) { $RejectMessagesFromSendersOrMembers += (Get-Recipient $addr -ErrorAction SilentlyContinue).PrimarySmtpAddress }

                    # Resolve RejectMessagesFromDLMembers
                    $RejectMessagesFromDLMembers = @()
                    foreach ($addr in $Group.RejectMessagesFromDLMembers) { $RejectMessagesFromDLMembers += (Get-Recipient $addr -ErrorAction SilentlyContinue).PrimarySmtpAddress }

                    # Resolve AcceptMessagesOnlyFrom
                    $AcceptMessagesOnlyFrom = @()
                    foreach ($addr in $Group.AcceptMessagesOnlyFrom) { $AcceptMessagesOnlyFrom += (Get-Recipient $addr -ErrorAction SilentlyContinue).PrimarySmtpAddress }

                    # Resolve AcceptMessagesOnlyFromDLMembers
                    $AcceptMessagesOnlyFromDLMembers = @()
                    foreach ($addr in $Group.AcceptMessagesOnlyFromDLMembers) { $AcceptMessagesOnlyFromDLMembers += (Get-Recipient $addr -ErrorAction SilentlyContinue).PrimarySmtpAddress }

                    # Resolve AcceptMessagesOnlyFromSendersOrMembers
                    $AcceptMessagesOnlyFromSendersOrMembers = @()
                    foreach ($addr in $Group.AcceptMessagesOnlyFromSendersOrMembers) { $AcceptMessagesOnlyFromSendersOrMembers += (Get-Recipient $addr -ErrorAction SilentlyContinue).PrimarySmtpAddress }

                    $Group | Add-Member -TypeName NoteProperty -NotePropertyName Subscribers -NotePropertyValue ($Subscribers -join ",") -Force
                    $Group | Add-Member -TypeName NoteProperty -NotePropertyName Members -NotePropertyValue ($Members -join ",") -Force
                    $Group | Add-Member -TypeName NoteProperty -NotePropertyName Owners -NotePropertyValue ($Owners -join ",") -Force
                    $Group | Add-Member -TypeName NoteProperty -NotePropertyName Aggregators -NotePropertyValue ($Aggregators -join ",") -Force
                    $Group | Select-Object ($Selectproperties1 + $CalculatedProps1 + $Selectproperties2 + $CalculatedProps2 + $Selectproperties3 + $CalculatedProps3 + $Selectproperties4 + $CalculatedProps4 + $Selectproperties5 + $CalculatedProps5 + $Selectproperties6 + $CalculatedProps6 + $Selectproperties7) | Export-Csv -Append $File -NoTypeInformation
                    $i++
                    $Group = $null
                } #End Foreach ($Group in UnifiedGroups)
                If ($RewriteTargetDomain) {
                    RewriteExport -File $File -SourceDomain $SourceDomain -TargetDomain $TargetDomain
                }
            } # End Switch Export
            Import {
                If ($RewriteTargetDomain) {
                    RewriteImport -File $File -SourceDomain $SourceDomain -TargetDomain $TargetDomain
                    $UnifiedGroups = Import-Csv $TempFile
                    Write-Host Importing $($TempFile)
                }
                Else {
                    $UnifiedGroups = Import-Csv $File
                }
                $Count = $UnifiedGroups.Count
                $i = 1
                foreach ($Group in $UnifiedGroups) {
                    Write-Host "Creating group $($Group.Name) [$i of $Count]"
                    New-UnifiedGroup -Name $Group.Name `
                        -Alias $Group.Alias `
                        -DisplayName $Group.DisplayName `
                        -AccessType $Group.AccessType `
                        -Classification $Group.Classification
                    $cmd = "Set-UnifiedGroup -Identity $($Group.Alias) "
                    $cmd += "-RequireSenderAuthenticationEnabled $" + "$($Group.RequireSenderAuthenticationEnabled) "
                    If ($Group.HiddenFromAddressListsEnabled) { $cmd += "-HiddenFromAddressListsEnabled $" + "$($Group.HiddenFromAddressListsEnabled)" }

                    # Unable to set these properties at this time
                    #If ($Group.HiddenGroupMembershipEnabled) { $cmd += "-HiddenGroupMembershipEnabled $" + "$($Group.HiddenGroupMembershipEnabled) " }
                    #If ($Group.AutoSubscribeNewMembers) { $cmd += "-AutoSubscribeNewMembers $" + "$($Group.AutoSubscribeNewMembers) " }
                    #If ($Group.SubscriptionEnabled) { $cmd += "-SubscriptionEnabled $" + "$($Group.SubscriptionEnabled) "}
                    #If ($Group.AlwaysSubscribeMembersToCalendarEvents) { $cmd += "-AlwaysSubscribeMembersToCalendarEvents $" + "$($Group.AlwaysSubscribeMembersToCalendarEvents) "}
                    #If ($Group.ReportToManagerEnabled) { $cmd += "-ReportToManagerEnabled $" + "$($Group.ReportToManagerEnabled) "}
                    #If ($Group.SendOofMessageToOriginatorEnabled) { $cmd += "-SendOofMessageToOriginatorEnabled $" + "$($Group.SendOofMessageToOriginatorEnabled) "}
                    #If ($Group.WelcomeMessageEnabled) { $cmd += "-WelcomeMessageEnabled $" + "$($Group.WelcomeMessageEnabled) " }
                    Invoke-Expression $cmd

                    # If the IncludeUsers switch has been specified, use this
                    If ($IncludeUsers) {
                        $AllRecipients = (Get-Recipient -ErrorAction SilentlyContinue -ResultSize Unlimited).PrimarySmtpAddress

                        $Members = @()
                        [array]$Members_All = $Group.Members.Split(",")
                        foreach ($Member_obj in $Members_All) {
                            if ($AllRecipients -contains $Member_obj) { $Members += $Member_obj }
                        }

                        $Subscribers = @()
                        [array]$Subscribers_All = $Group.Subscribers.Split(",")
                        foreach ($Subscriber_obj in $Subscribers_All) {
                            if ($AllRecipients -contains $Subscriber_obj) { $Subscribers += $Subscriber_obj }
                        }

                        $Owners = @()
                        [array]$Owners_All = $Group.Owners.Split(",")
                        foreach ($Owner_obj in $Owners_All) {
                            if ($AllRecipients -contains $Owner_obj) { $Owners += $Owner_obj }
                        }

                        $Aggregators = @()
                        [array]$Aggregators_All = $Group.Aggregators.Split(",")
                        foreach ($Aggregator_obj in $Aggregators_All) {
                            if ($AllRecipients -contains $Aggregator_obj) { $Aggregators += $Aggregator_obj }
                        }

                        $ManagedByDetails = @()
                        [array]$ManagedByDetails_All = $Group.ManagedByDetails.Split(",")
                        foreach ($ManagedByDetails_obj in $ManagedByDetails_All) {
                            if ($AllRecipients -contains $ManagedByDetails_obj) { $ManagedByDetails += $ManagedByDetails_obj }
                        }

                        $ManagedBy = @()
                        [array]$ManagedBy_All = $Group.ManagedBy.Split(",")
                        foreach ($ManagedBy_obj in $ManagedBy_All) {
                            if ($AllRecipients -contains $ManagedBy_Obj) { $ManagedBy += $ManagedBy_Obj }
                        }

                        $ModeratedBy = @()
                        [array]$ModeratedBy_All = $Group.ModeratedBy.Split(",")
                        foreach ($ModeratedBy_obj in $ModeratedBys_All) {
                            if ($AllRecipients -contains $ModeratedBy_Obj) { $ModeratedBy += $ModeratedBy_Obj }
                        }

                        $AcceptMessagesOnlyFrom = @()
                        [array]$AcceptMessagesOnlyFrom_All = $Group.AcceptMessagesOnlyFrom.Split(",")
                        foreach ($AcceptMessagesOnlyFrom_obj in $AcceptMessagesOnlyFrom_All) {
                            if ($AllRecipients -contains $AcceptMessagesOnlyFrom_Obj) { $AcceptMessagesOnlyFrom += $AcceptMessagesOnlyFrom_Obj }
                        }

                        $AcceptMessagesOnlyFromDLMembers = @()
                        [array]$AcceptMessagesOnlyFromDLMembers_All = $Group.AcceptMessagesOnlyFromDLMembers.Split(",")
                        foreach ($AcceptMessagesOnlyFromDLMembers_obj in $AcceptMessagesOnlyFromDLMembers_All) {
                            if ($AllRecipients -contains $AcceptMessagesOnlyFromDLMembers_Obj) { $AcceptMessagesOnlyFromDLMembers += $AcceptMessagesOnlyFromDLMembers_Obj }
                        }

                        $AcceptMessagesOnlyFromSendersOrMembers = @()
                        [array]$AcceptMessagesOnlyFromSendersOrMembers_All = $Group.AcceptMessagesOnlyFromSendersOrMembers.Split(",")
                        foreach ($AcceptMessagesOnlyFromSendersOrMembers_obj in $AcceptMessagesOnlyFromSendersOrMembers_All) {
                            if ($AllRecipients -contains $AcceptMessagesOnlyFromSendersOrMembers_Obj) { $AcceptMessagesOnlyFromSendersOrMembers += $AcceptMessagesOnlyFromSendersOrMembers_Obj }
                        }

                        $RejectMessagesFrom = @()
                        [array]$RejectMessagesFrom_All = $Group.RejectMessagesFrom.Split(",")
                        foreach ($RejectMessagesFrom_obj in $RejectMessagesFrom_All) {
                            if ($AllRecipients -contains $RejectMessagesFrom_Obj) { $RejectMessagesFrom += $RejectMessagesFrom_Obj }
                        }

                        $GrantSendOnBehalfTo = @()
                        [array]$GrantSendOnBehalfTo_All = $Group.GrantSendOnBehalfTo.Split(",")
                        foreach ($GrantSendOnBehalfTo_obj in $GrantSendOnBehalfTo_All) {
                            if ($AllRecipients -contains $GrantSendOnBehalfTo_Obj) { $GrantSendOnBehalfTo += $GrantSendOnBehalfTo_Obj }
                        }

                        $RejectMessagesFromSendersOrMembers = @()
                        [array]$RejectMessagesFromSendersOrMembers_All = $Group.RejectMessagesFromSendersOrMembers.Split(",")
                        foreach ($RejectMessagesFromSendersOrMembers_obj in $RejectMessagesFromSendersOrMembers_All) {
                            if ($AllRecipients -contains $RejectMessagesFromSendersOrMembers_Obj) { $RejectMessagesFromSendersOrMembers += $RejectMessagesFromSendersOrMembers_Obj }
                        }

                        $RejectMessagesFromDLMembers = @()
                        [array]$RejectMessagesFromDLMembers_All = $Group.RejectMessagesFromDLMembers.Split(",")
                        foreach ($RejectMessagesFromDLMembers_obj in $RejectMessagesFromDLMembers_All) {
                            if ($AllRecipients -contains $RejectMessagesFromDLMembers_Obj) { $RejectMessagesFromDLMembers += $RejectMessagesFromDLMembers_Obj }
                        }

                        # Add Group Links
                        # Members
                        $cmd = "Add-UnifiedGroupLinks -Identity $($Group.Alias) "
                        If ($Members) { $cmd += "-LinkType Members -Links `$Members " }
                        Invoke-Expression $cmd

                        # Subscribers
                        $cmd = "Add-UnifiedGroupLinks -Identity $($Group.Alias) "
                        If ($Subscribers) { $cmd += "-LinkType Subscribers -Links `$Subscribers " }

                        # Owners
                        $cmd = "Add-UnifiedGroupLinks -Identity $($Group.Alias) "
                        If ($Owners) { $cmd += "-LinkType Owners -Links `$Owners " }

                        # Aggregators
                        $cmd = "Add-UnifiedGroupLinks -Identity $($Group.Alias) "
                        If ($Aggregators) { $cmd += "-LinkType Aggregators -Links`$Aggregators " }

                        # Unable to set these properties at this time
                        #If ($ManagedByDetails) { $cmd += "-ManagedByDetails `$ManagedByDetails " }
                        #If ($ModeratedBy) { $cmd += "-ModeratedBy `$ModeratedBy " }

                        # Accept and reject settings
                        $cmd = "Set-UnifiedGroup -Identity $($Group.Alias) "
                        If ($AcceptMessagesOnlyFrom) { $cmd += "-AcceptMessagesOnlyFrom `$AcceptMessagesOnlyFrom " }
                        If ($AcceptMessagesOnlyFromDLMembers) { $cmd += "-AcceptMessagesOnlyFromDLMembers `$AcceptMessagesOnlyFromDLMembers " }
                        If ($AcceptMessagesOnlyFromSendersOrMembers) { $cmd += "-AcceptMessagesOnlyFromSendersOrMembers `$AcceptMessagesOnlyFromSendersOrMembers " }
                        If ($RejectMessagesFrom) { $cmd += "-RejectMessagesFrom `$RejectMessagesFrom " }
                        If ($GrantSendOnBehalfTo) { $cmd += "-GrantSendOnBehalfTo `$GrantSendOnBehalfTo " }
                        If ($RejectMessagesFromSendersOrMembers) { $cmd += "-RejectMessagesFromSendersOrMembers `$RejectMessagesFromSendersOrMembers " }
                        If ($RejectMessagesFromDLMembers) { $cmd += "-RejectMessagesFromDLMembers `$RejectMessagesFromDLMembers" }
                        Invoke-Expression $cmd
                    } #End If IncludeUsers
                    $i++
                } # End Foreach
            } # End Import

            Set {
                $AllRecipients = (Get-Recipient -ErrorAction SilentlyContinue -ResultSize Unlimited).PrimarySmtpAddress
                If ($RewriteTargetDomain) {
                    RewriteImport -File $File -SourceDomain $SourceDomain -TargetDomain $TargetDomain
                    $UnifiedGroups = Import-Csv $TempFile
                }
                Else {
                    $UnifiedGroups = Import-Csv $File
                }
                foreach ($Group in $UnifiedGroups) {
                    Write-Host "Processing $($Group.Name) [$i of $Count]"
                    $Members = @()
                    [array]$Members_All = $Group.Members.Split(",")
                    foreach ($Member_obj in $Members_All) {
                        if ($AllRecipients -contains $Member_obj) { $Members += $Member_obj }
                    }

                    $Subscribers = @()
                    [array]$Subscribers_All = $Group.Subscribers.Split(",")
                    foreach ($Subscriber_obj in $Subscribers_All) {
                        if ($AllRecipients -contains $Subscriber_obj) { $Subscribers += $Subscriber_obj }
                    }

                    $Owners = @()
                    [array]$Owners_All = $Group.Owners.Split(",")
                    foreach ($Owner_obj in $Owners_All) {
                        if ($AllRecipients -contains $Owner_obj) { $Owners += $Owner_obj }
                    }

                    $Aggregators = @()
                    [array]$Aggregators_All = $Group.Aggregators.Split(",")
                    foreach ($Aggregator_obj in $Aggregators_All) {
                        if ($AllRecipients -contains $Aggregator_obj) { $Aggregators += $Aggregator_obj }
                    }

                    $ManagedByDetails = @()
                    [array]$ManagedByDetails_All = $Group.ManagedByDetails.Split(",")
                    foreach ($ManagedByDetails_obj in $ManagedByDetails_All) {
                        if ($AllRecipients -contains $ManagedByDetails_obj) { $ManagedByDetails += $ManagedByDetails_obj }
                    }

                    $ManagedBy = @()
                    [array]$ManagedBy_All = $Group.ManagedBy.Split(",")
                    foreach ($ManagedBy_obj in $ManagedBy_All) {
                        if ($AllRecipients -contains $ManagedBy_Obj) { $ManagedBy += $ManagedBy_Obj }
                    }

                    $ModeratedBy = @()
                    [array]$ModeratedBy_All = $Group.ModeratedBy.Split(",")
                    foreach ($ModeratedBy_obj in $ModeratedBys_All) {
                        if ($AllRecipients -contains $ModeratedBy_Obj) { $ModeratedBy += $ModeratedBy_Obj }
                    }

                    $AcceptMessagesOnlyFrom = @()
                    [array]$AcceptMessagesOnlyFrom_All = $Group.AcceptMessagesOnlyFrom.Split(",")
                    foreach ($AcceptMessagesOnlyFrom_obj in $AcceptMessagesOnlyFrom_All) {
                        if ($AllRecipients -contains $AcceptMessagesOnlyFrom_Obj) { $AcceptMessagesOnlyFrom += $AcceptMessagesOnlyFrom_Obj }
                    }

                    $AcceptMessagesOnlyFromDLMembers = @()
                    [array]$AcceptMessagesOnlyFromDLMembers_All = $Group.AcceptMessagesOnlyFromDLMembers.Split(",")
                    foreach ($AcceptMessagesOnlyFromDLMembers_obj in $AcceptMessagesOnlyFromDLMembers_All) {
                        if ($AllRecipients -contains $AcceptMessagesOnlyFromDLMembers_Obj) { $AcceptMessagesOnlyFromDLMembers += $AcceptMessagesOnlyFromDLMembers_Obj }
                    }

                    $AcceptMessagesOnlyFromSendersOrMembers = @()
                    [array]$AcceptMessagesOnlyFromSendersOrMembers_All = $Group.AcceptMessagesOnlyFromSendersOrMembers.Split(",")
                    foreach ($AcceptMessagesOnlyFromSendersOrMembers_obj in $AcceptMessagesOnlyFromSendersOrMembers_All) {
                        if ($AllRecipients -contains $AcceptMessagesOnlyFromSendersOrMembers_Obj) { $AcceptMessagesOnlyFromSendersOrMembers += $AcceptMessagesOnlyFromSendersOrMembers_Obj }
                    }

                    $RejectMessagesFrom = @()
                    [array]$RejectMessagesFrom_All = $Group.RejectMessagesFrom.Split(",")
                    foreach ($RejectMessagesFrom_obj in $RejectMessagesFrom_All) {
                        if ($AllRecipients -contains $RejectMessagesFrom_Obj) { $RejectMessagesFrom += $RejectMessagesFrom_Obj }
                    }

                    $GrantSendOnBehalfTo = @()
                    [array]$GrantSendOnBehalfTo_All = $Group.GrantSendOnBehalfTo.Split(",")
                    foreach ($GrantSendOnBehalfTo_obj in $GrantSendOnBehalfTo_All) {
                        if ($AllRecipients -contains $GrantSendOnBehalfTo_Obj) { $GrantSendOnBehalfTo += $GrantSendOnBehalfTo_Obj }
                    }

                    $RejectMessagesFromSendersOrMembers = @()
                    [array]$RejectMessagesFromSendersOrMembers_All = $Group.RejectMessagesFromSendersOrMembers.Split(",")
                    foreach ($RejectMessagesFromSendersOrMembers_obj in $RejectMessagesFromSendersOrMembers_All) {
                        if ($AllRecipients -contains $RejectMessagesFromSendersOrMembers_Obj) { $RejectMessagesFromSendersOrMembers += $RejectMessagesFromSendersOrMembers_Obj }
                    }

                    $RejectMessagesFromDLMembers = @()
                    [array]$RejectMessagesFromDLMembers_All = $Group.RejectMessagesFromDLMembers.Split(",")
                    foreach ($RejectMessagesFromDLMembers_obj in $RejectMessagesFromDLMembers_All) {
                        if ($AllRecipients -contains $RejectMessagesFromDLMembers_Obj) { $RejectMessagesFromDLMembers += $RejectMessagesFromDLMembers_Obj }
                    }

                    # Add Group Links
                    # Members
                    $cmd = "Add-UnifiedGroupLinks -Identity $($Group.Alias) "
                    If ($Members) { $cmd += "-LinkType Members -Links `$Members " }
                    Invoke-Expression $cmd

                    # Subscribers
                    $cmd = "Add-UnifiedGroupLinks -Identity $($Group.Alias) "
                    If ($Subscribers) { $cmd += "-LinkType Subscribers -Links `$Subscribers " }

                    # Owners
                    $cmd = "Add-UnifiedGroupLinks -Identity $($Group.Alias) "
                    If ($Owners) { $cmd += "-LinkType Owners -Links `$Owners " }

                    # Aggregators
                    $cmd = "Add-UnifiedGroupLinks -Identity $($Group.Alias) "
                    If ($Aggregators) { $cmd += "-LinkType Aggregators -Links`$Aggregators " }

                    # Unable to set these properties at this time
                    #If ($ManagedByDetails) { $cmd += "-ManagedByDetails `$ManagedByDetails " }
                    #If ($ModeratedBy) { $cmd += "-ModeratedBy `$ModeratedBy " }

                    # Accept and reject settings
                    $cmd = "Set-UnifiedGroup -Identity $($Group.Alias) "
                    If ($AcceptMessagesOnlyFrom) { $cmd += "-AcceptMessagesOnlyFrom `$AcceptMessagesOnlyFrom " }
                    If ($AcceptMessagesOnlyFromDLMembers) { $cmd += "-AcceptMessagesOnlyFromDLMembers `$AcceptMessagesOnlyFromDLMembers " }
                    If ($AcceptMessagesOnlyFromSendersOrMembers) { $cmd += "-AcceptMessagesOnlyFromSendersOrMembers `$AcceptMessagesOnlyFromSendersOrMembers " }
                    If ($RejectMessagesFrom) { $cmd += "-RejectMessagesFrom `$RejectMessagesFrom " }
                    If ($GrantSendOnBehalfTo) { $cmd += "-GrantSendOnBehalfTo `$GrantSendOnBehalfTo " }
                    If ($RejectMessagesFromSendersOrMembers) { $cmd += "-RejectMessagesFromSendersOrMembers `$RejectMessagesFromSendersOrMembers " }
                    If ($RejectMessagesFromDLMembers) { $cmd += "-RejectMessagesFromDLMembers `$RejectMessagesFromDLMembers" }
                    Invoke-Expression $cmd
                    $i++
                }
            } # End Set
        } # End Switch
        #Cleanup
        If ($TempFile) { Remove-Item $TempFile }
    }
}