ExportImport-ForwardingAddress.ps1

<#PSScriptInfo
 
.VERSION 3.2
 
.GUID 87f572c4-2e90-4d42-b743-394b69ee432a
 
.AUTHOR Aaron Guilmette
 
.COMPANYNAME Microsoft
 
.COPYRIGHT 2020
 
.TAGS
 
.LICENSEURI
 
.PROJECTURI https://www.undocumented-features.com/2018/09/13/forwarding-address-import-and-export/
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
.DESCRIPTION
Use to export/backup forwarding addresses from one environment and restore/import into a target environment.
 
.PRIVATEDATA
 
#>


<#
.SYNOPSIS
Use to export/backup forwarding addresses from one environment and restore/
import into a target environment. This script captures two types of forwards:
- Exchange Forwarding object: A mail-enabled Exchange object, such as a mailbox,
  mail-enabled user, or mail contact.
- Generic SMTP Forward: an SMTP address value that may be internal or external
  to the organization.
   
Forwards are imported/restored as Generic SMTP forwards in the target
environment.
 
.PARAMETER Domain
Use to filter source objects based on SMTP suffix.
 
.PARAMETER Filename
Import or export filename.
 
.PARAMETER Mode
Export or Import.
 
.EXAMPLE
.\ForwardingExportImport.ps1 -Domain sub.contoso.com -Filename sub.contoso.com.csv -Mode Export
Exports forwarding parameters for mailboxes in the sub.contoso.com domain to file sub.contoso.com.csv.
 
.EXAMPLE
.\ForwardingExportImport.ps1 -Filename sub.contoso.com.csv -Mode Import
Imports forwarding parameters for mailboxes in the file sub.contoso.com.csv.
 
.LINK
https://gallery.technet.microsoft.com/Forwarding-Address-Import-5b3ead8e
 
.NOTES
- 2019-02-09 Updated line 72 to reflect missing -Filter parameter.
- 2018-09-12 Updated cmdlet to use server side filter to speed up results.
- 2018-04-05 Updated else {} statement to include DeliverToMailboxAndForward value.
- 2017-11-21 Removed windows file dialog box and changed import/export to
                parameter-based.
                Combined separate Get/Set scripts into single script with export /
                import capability.
- 2015-02-19 Original release.
#>


[CmdletBinding()]
param
    (
     [Parameter(Mandatory = $false)][string]$Domain,
    [Parameter(Mandatory = $true)][string]$Filename = "ExportForwardingSmtpAddresses.csv",
    [Parameter(ParameterSetName='Mode',Mandatory = $true)][ValidateSet("Export","Import")][string]$Mode
    )

Switch($Mode)
    {
    Export
        {
        $global:Domain = $Domain.ToString()
        $global:Domain = [scriptblock]::create("WindowsEmailAddress -like `"*$Domain`"")
        
        If ($Domain)
        {
            $cmd = "`$Users = Get-Mailbox -ResultSize Unlimited -Filter {((ForwardingAddress -ne `$null) -or (ForwardingSmtpAddress -ne `$null)) -and (WindowsEmailAddress -like `"*"
            $cmd = $cmd + $Domain
            $cmd = $cmd + "`")}"
            Invoke-Expression $cmd
            Write-Host "Found $($users.Count) users in $($Domain)."
        }
        Else
        {
            $Users = Get-Mailbox -ResultSize Unlimited -Filter { (ForwardingAddress -ne $null) -or (ForwardingSmtpAddress -ne $null) }
            Write-Host "Found $($Users.count)."
        }
        $header = "UPN,ForwardingSmtpAddress,DeliverToMailboxAndForward"
        $header | Out-File $Filename

        ForEach ($User in $Users) 
            {
            # Check to see if there is a Forwarding Smtp Address or a Contact Object
            # Check to see if "forwardingSmtpAddress" value
            Write-Host -NoNewline "Processing ";Write-Host -ForegroundColor Green $user.PrimarySmtpAddress
            if ($user.ForwardingSmtpAddress -ne $null)
                {
                Write-Host " Forwarding SMTP address found."
                Write-Host -ForegroundColor Yellow " $($user.PrimarySmtpAddress) > $($user.ForwardingSmtpAddress)"
                $forwardingSmtpAddress = $user.ForwardingSmtpAddress
                $DeliverToMailboxAndForward = $User.DeliverToMailboxAndForward.ToString()
                $logstring = "$($user.PrimarySmtpAddress),$($forwardingSmtpAddress),$($DeliverToMailboxAndForward)"
                $logstring | Out-File $Filename -Append
                }
            else
                {
                # Check to see if "forwarding contact" or "Forwarding Address"
                if ($user.ForwardingAddress -ne $null)
                    {
                    Write-Host " Forwarding address (CONTACT, DISTRIBUTION GROUP, MAILBOX, OR MAILUSER) object found."
                    Write-Host -ForegroundColor Yellow " $($user.PrimarySmtpAddress) > $($User.ForwardingAddress)"
                    $forwardingContact = $user.ForwardingAddress
                    $forwardingContactAddress = (Get-Recipient $forwardingContact).PrimarySmtpAddress
                    $DeliverToMailboxAndForward = $User.DeliverToMailboxAndForward.ToString()
                    Write-Host -ForegroundColor Yellow " $($User.ForwardingAddress) > $($forwardingContactAddress)"
                    $logString = "$($user.PrimarySmtpAddress),$($forwardingContactAddress),$($DeliverToMailboxAndForward)" 
                    $logString | Out-File $Filename -Append
                    }
                }
            }
        } # End Export
    Import
        {
        $Users = Import-Csv $Filename
        ForEach ($user in $users) {
        Write-Host -ForegroundColor Green "Setting $($user.UPN) forwarding address to $($user.ForwardingSmtpAddress)"
            $DeliverToMailboxAndForward = [System.Convert]::ToBoolean($User.DeliverToMailboxAndForward)
            Set-Mailbox -Identity $($user.UPN) -DeliverToMailboxAndForward $DeliverTomailboxAndForward -ForwardingSmtpAddress $($user.ForwardingSmtpAddress)
        }
        }
    }