# Copyright (c) Microsoft Corporation. All rights reserved.
#
# THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND. THE ENTIRE RISK
# OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER.
# Synopsis: This script is designed to move mailboxes and create a contact or mail enable the user on the source Forest.
#
#
# Usage:
#
# .\migrationCleanup.ps1 -UsersFile "D:\users.csv" -TargetDatabase 'ExServer1\Mailbox Database'
# -SourceForestCredential $s -TargetForestCredential $t
# -SourceGlobalCatalog gc.test-dom1.com -SourceDomainController dc.test-dom1.com
# -GlobalCatalog gc.test-dom2.com -DomainController dc.test-dom2.com
# -NTAccountOU 'CN=Users,DC=test-dom2,DC=com' -ContactsOU "ContactsOU"
# -SourceMailboxCleanupOptions DeleteSourceMailbox -TargetSMTPDomain "test-dom1.com"
#
# Moves mailboxes listed on D:\users.csv from Org test-dom1.com to ExServer1\Mailbox Database on Org test-dom2,
# deletes the source mailbox and mail enables the source user so email is redirected to the mailbox on test-dom2
#
#
# .\migrationCleanup.ps1 -UsersFile "D:\users.csv" -TargetDatabase 'ExServer1\Mailbox Database'
# -SourceForestCredential $s -TargetForestCredential $t
# -SourceGlobalCatalog gc.test-dom1.com -SourceDomainController dc.test-dom1.com
# -GlobalCatalog gc.test-dom2.com -DomainController dc.test-dom2.com
# -NTAccountOU 'CN=Users,DC=test-dom2,DC=com' -ContactsOU "ContactsOU"
# -SourceMailboxCleanupOptions DeleteSourceNTAccount -TargetSMTPDomain "test-dom1.com"
#
# Moves mailboxes listed on D:\users.csv from Org test-dom1.com to ExServer1\Mailbox Database on Org test-dom2,
# deletes the source user and creates a contact so email is redirected to the mailbox on test-dom2
#
Param(
[string] $SourceGlobalCatalog = $(throw "Missing parameter: The -SourceGlobalCatalog parameter is required."),
[string] $SourceDomainController = $(throw "Missing parameter: The -SourceDomainController parameter is required."),
[string] $GlobalCatalog = $(throw "Missing parameter: The -GlobalCatalog parameter is required."),
[string] $DomainController = $(throw "Missing parameter: The -DomainController parameter is required."),
[string] $NTAccountOU = $(throw "Missing parameter: The -NTAccountOU parameter is required."),
[string] $ContactsOU = $(throw "Missing parameter: The -ContactsOU parameter is required."),
[string] $UsersFile = $(throw "Missing parameter: The -UsersFile parameter is required."),
[string] $TargetDatabase = $(throw "Missing parameter: The -TargetDatabase parameter is required."),
[String] $SourceMailboxCleanupOptions = $(throw "Missing parameter: The -SourceMailboxCleanupOptions parameter is required. Options are: DeleteSourceMailbox and DeleteSourceNTAccount."),
[System.Management.automation.PSCredential] $SourceForestCredential = $(throw "Missing parameter: The -SourceForestCredential parameter is required."),
[System.Management.automation.PSCredential] $TargetForestCredential = $(throw "Missing parameter: The -TargetForestCredential parameter is required."),
[string] $TargetSMTPDomain = $(throw "Missing parameter: The -TargetSMTPDomain parameter is required.")
)
############################################################ Variable Declarations ################################################################
# Suppress warnings during script execution
$WarningPreference="SilentlyContinue"
# Opens log file
$this_date = get-date
$format_date = $this_date.ToString("d") -replace "/", ""
$file_date = $format_date+"_"+$this_date.TimeOfDay.Hours+$this_date.TimeOfDay.Minutes+$this_date.TimeOfDay.Seconds
# Log is saved on the directory defined here
$file_name = "C:\$($file_date)movecleanup.log"
############################################################ Variable Declarations End ############################################################
############################################################ Function Declarations ################################################################
# Adds to log file
function log
{
Param($header,$Message)
$log_date = get-date
echo "[$($log_date)]: [$($header)]: $($Message)" >> $file_name
}
function logExit
{
Param($header,$exitMessage)
log $header $exitMessage
echo "$($header): $($exitMessage)"
break
}
############################################################ Function Declarations End ############################################################
############################################################ Main Script Block ####################################################################
log "Initializing" "Starting Migration: $($a_date)"
# checks if Contacts OU is valid
$error.Clear()
$rc = get-recipient -OrganizationalUnit $ContactsOU -ErrorAction SilentlyContinue -ResultSize 1
if (![String]::IsNullorEmpty($error[0]))
{
logExit "Pre-validation" "Mailbox migration was not successful. Step: check Contacts OU. Error= $($error[0])."
}
else
{
log "Pre-Validation" "ContactsOU = $($ContactsOU)"
}
# checks if Source Global Catalog is valid
$error.Clear()
$rc = get-recipient -DomainController $SourceGlobalCatalog -ErrorAction SilentlyContinue -ResultSize 1
if (![String]::IsNullorEmpty($error[0]))
{
logExit "Pre-validation" "Mailbox migration was not successful. Step: check Source Global Catalog. Error= $($error[0])."
}
else
{
log "Pre-Validation" "Source Global Catalog = $($SourceGlobalCatalog)"
}
# checks if Source Domain Controller is valid
$error.Clear()
$rc = get-recipient -DomainController $SourceDomainController -ErrorAction SilentlyContinue -ResultSize 1
if (![String]::IsNullorEmpty($error[0]))
{
logExit "Pre-validation" "Mailbox migration was not successful. Step: check Source Domain Controller. Error= $($error[0])."
}
else
{
log "Pre-Validation" "Source Domain Controller = $($SourceDomainController)"
}
# checks if Target Global Catalog is valid
$error.Clear()
$rc = get-recipient -DomainController $GlobalCatalog -ErrorAction SilentlyContinue -ResultSize 1 -Credential $TargetForestCredential
if (![String]::IsNullorEmpty($error[0]))
{
logExit "Pre-validation" "Mailbox migration was not successful. Step: check Target Global Catalog. Error= $($error[0])."
}
else
{
log "Pre-Validation" "Target Global Catalog = $($GlobalCatalog)"
}
# checks if Target Domain Controller is valid
$error.Clear()
$rc = get-recipient -DomainController $DomainController -ErrorAction SilentlyContinue -ResultSize 1 -Credential $TargetForestCredential
if (![String]::IsNullorEmpty($error[0]))
{
logExit "Pre-validation" "Mailbox migration was not successful. Step: check Target Domain Controller. Error= $($error[0])."
}
else
{
log "Pre-Validation" "Target Domain Controller = $($DomainController)"
}
# read users to be moved
$error.Clear()
$UserFile = import-csv -Path $UsersFile -OutVariable string -ErrorAction SilentlyContinue
if (![String]::IsNullorEmpty($error[0]))
{
logExit "Pre-validation" "Mailbox migration was not successful. Step: Opening User list file. Error= $($error[0])."
}
$UserList = @()
# Filters Identity out of the csv and make sure we only try to move mailbox objects
foreach ($user in $UserFile)
{
if (![String]::IsNullorEmpty($user))
{
$this_id = $user.Identity
if (![String]::IsNullorEmpty($this_id))
{
$rc = get-recipient $this_id -ErrorAction SilentlyContinue
if ($rc -eq $null)
{
log "Pre-validation" "Can not move user: $this_id . Please check whether this mailbox exists"
echo "Can not move user: $this_id . Please check whether this mailbox exists"
}
else
{
# user exists. Check recipient type
if ($rc.RecipientType -eq "UserMailbox")
{
$UserList+=$rc.alias
}
else
{
log "Pre-validation" "Can not move user: $this_id . Recipient Type: $($rc.RecipientType)"
echo "Can not move user: $this_id . Recipient Type: $($rc.RecipientType)"
}
}
}
else
{
log "Pre-validation" "Can not move user: $this_id . Please check whether this mailbox exists"
echo "Can not move user: $this_id . Please check whether this mailbox exists"
}
}
}
if ($UserList.count -lt 1)
{
logExit "Pre-validation" "There are no mailboxes to be moved."
}
log "Pre-validation" "Going to move: $UserList"
# hashtables for source data
$sourceID =@{}
$sourceAlias =@{}
$sourceName =@{}
$sourceDisplayName =@{}
$sourceAddresses =@{}
$sourceFirstName =@{}
$sourceLastName =@{}
# store source data before move
$UserList | get-recipient | foreach {
$sourceID[$_.Identity] = $_.Identity
$sourceAlias[$_.Identity] = $_.Alias
$sourceName[$_.Identity] = $_.Name
$sourceDisplayName[$_.Identity] = $_.DisplayName
[System.Collections.ArrayList]$sourceAddresses[$_.Identity] = $_.EmailAddresses
#set extensionAttribute14 to 1 (block GALSync?)
set-mailbox -Identity $_.Identity -CustomAttribute14 1
}
# store other source user attributes before move
$UserList | get-user | foreach {
$sourceFirstName[$_.Identity] = $_.FirstName
$sourceLastName[$_.Identity] = $_.LastName
}
# move the mailbox and do cleanup for each mailbox moved
$UserList | move-mailbox -SourceForestGlobalCatalog $SourceGlobalCatalog -TargetDatabase $TargetDatabase -GlobalCatalog $GlobalCatalog –DomainController $DomainController –NTAccountOU $NTAccountOU -PreserveMailboxSizeLimit -IgnorePolicyMatch -ErrorAction SilentlyContinue -SourceMailboxCleanupOptions $SourceMailboxCleanupOptions -SourceForestCredential $SourceForestCredential -TargetForestCredential $TargetForestCredential -Confirm:$false | foreach {
# cleaning temp variables
$targetSMTP=$null
$TargetSMTPString=$null
$tempPrimary=$null
$tempx500=$null
# Is there a better way to check if an error occured?
if ($_.StatusCode -lt 0)
{
logExit "$($thisSourceAlias)" "Move-mailbox for User: $($_.Identity) was not successful. Error= $($_.StatusMessage). Migration Cleanup script can't continue."
}
# temp variables for the mailbox that was just moved
$thisSourceID = $sourceID[$_.Identity]
$thisSourceAlias = $sourceAlias[$_.Identity]
$thisSourceName = $sourceName[$_.Identity]
$thisSourceDisplayName = $sourceDisplayName[$_.Identity]
$thisSourceAddresses = $sourceAddresses[$_.Identity]
$thisSourceFirstName = $sourceFirstName[$_.Identity]
$thisSourceLastName = $sourceLastName[$_.Identity]
log "$($thisSourceAlias)" "Move-mailbox for User: $($_.Identity) was successful."
log "$($thisSourceAlias)" "Source Mailbox Alias: $thisSourceAlias"
log "$($thisSourceAlias)" "Source Mailbox Name: $thisSourceName"
log "$($thisSourceAlias)" "Source Mailbox DisplayName: $thisSourceDisplayName"
log "$($thisSourceAlias)" "Source Mailbox Addresses: $thisSourceAddresses"
log "$($thisSourceAlias)" "Source Mailbox FirstName: $thisSourceFirstName"
log "$($thisSourceAlias)" "Source Mailbox LastName: $thisSourceLastName"
log "$($thisSourceAlias)" "Source Domain Controller: $($_.SourceDomainController.toString())"
# if delete source mailbox was used we try to mail enable the remaining source user
if ($SourceMailboxCleanupOptions -eq "DeleteSourceMailbox")
{
# double check if user exists
$error.Clear()
$rc = get-user -Identity $($thissourceID) -DomainController $($_.SourceDomainController) -ErrorAction SilentlyContinue
if ($rc -eq $null)
{
logExit "$($thisSourceAlias)" "Cleanup for User: $($thissourceID) was not successful. Step: get-user. Error= $($error[0])."
}
if ($rc.Identity.ToString() -eq $thisSourceID)
{
# user exists. Check recipient type
if ($rc.RecipientType -eq "User")
{
# grab newly created mailbox
$error.Clear()
$targetUser = get-mailbox -Identity "$($thisSourceAlias)" -DomainController $DomainController -ErrorAction SilentlyContinue -Credential $TargetForestCredential
if ($targetUser -eq $null)
{
logExit "$($thisSourceAlias)" "Cleanup for User: $($thissourceID) was not successful. Step: get-mailbox. Error= $($error[0])."
}
log "$($thisSourceAlias)" "Target Mailbox ID: $($targetUser.Identity)"
log "$($thisSourceAlias)" "Target Mailbox EmailAddresses: $($targetUser.EmailAddresses)"
# browse through target addresses to find out new primary
foreach ($temp in $targetUser.EmailAddresses)
{
if ( ($temp.isPrimaryAddress -eq $true) -and ($temp.Prefix -ilike "SMTP"))
{
# Primary SMTP
$targetSMTP = [String]$temp.ToString()
$targetSMTPString = $temp.get_AddressString()
}
}
if ([String]::IsNullorEmpty($targetSMTP) )
{
# checks if TargetSMTPDomain was passed
if ([String]::IsNullorEmpty($TargetSMTPDomain) )
{
logExit "$($thisSourceAlias)" "Cleanup for User: $($thissourceID) was not successful. Step: Get primary SMTP address. If the target server is an Exchange 2003 server please use the parameter -TargetSMTPDomain."
}
else
{
$targetSMTP = $thissourceAlias+"@"+$TargetSMTPDomain
$targetSMTPString = $targetSMTP
}
}
log "$($thisSourceAlias)" "Target Mailbox Primary SMTP: $($targetSMTP)"
# Mail Enable user
$error.Clear()
$sourceMailEnabledUser = Enable-MailUser -Identity $thissourceID -Alias "$($thissourceAlias)" -ExternalEmailAddress $targetSMTP -DomainController $_.SourceDomainController -ErrorAction SilentlyContinue
if ($sourceMailEnabledUser -eq $null)
{
logExit "$($thisSourceAlias)" "Cleanup for User: $($thissourceID) was not successful. Step: Enable-MailUser. Error= $($error[0])."
echo "Cleanup for User: $($thissourceID) was not successful. Step: Enable-MailUser. Error= $($error[0])."
}
else
{
log "$($thisSourceAlias)" "User: $($thissourceID) has been mail enabled"
}
log "$($thisSourceAlias)" "Source Mailuser EmailAddresses: $($sourceMailEnabledUser.EmailAddresses)"
# save all proxies to collection
$targetProxies = new-object System.Collections.ArrayList
$tmp1targetProxies = new-object System.Collections.ArrayList
$tmp2targetProxies = new-object System.Collections.ArrayList
# start by copying current addresses
$targetProxies = $sourceMailEnabledUser.EmailAddresses
# Add proxies from original source mailbox to mail enabled user proxy collection
foreach ($temp in $thisSourceAddresses)
{
if ( ($temp.isPrimaryAddress -eq $true) )
{
# Change all primaries to secondaries
$newProxy = $temp.ToSecondary()
}
else
{
$newProxy = $temp
}
# checks if value already exists in collection
if (!$targetProxies.Contains($newProxy))
{
$rc = $targetProxies.Add($newProxy)
}
else
{
#log "$($thisSourceAlias)" "Proxy: $newProxy already exists in collection"
}
}
# Tries to Add target SMTP to proxy collection (it is necessary if address was calculated for a Ti target server)
$tempPrimary = New-Object Microsoft.Exchange.Data.CustomProxyAddress "SMTP", $targetSMTPString, $true
log "$($thisSourceAlias)" "Primary: $($tempPrimary) calculated"
# checks if value already exists in collection
if (!$targetProxies.Contains($tempPrimary))
{
# we need to insert this address as the first in the list, otherwise it will not be primary
$rc = $tmp1targetProxies.Add($tempPrimary)
$rc = $tmp1targetProxies.AddRange($targetProxies)
$targetProxies=$tmp1targetProxies
}
else
{
log "$($thisSourceAlias)" "Proxy: $($tempPrimary) already exists in collection"
# Ensures Primary is first on list
[Int]$PrimaryIndex = $targetProxies.IndexOf($tempPrimary)
if (!$PrimaryIndex -eq 0)
{
# Primary is not first, so we need to reorder array
# Splt Primary and other proxies add them to separate arrays
foreach ($proxy in $targetProxies)
{
if ( ($proxy.isPrimaryAddress -eq $true) -and ($proxy.Prefix -ilike "SMTP"))
{
$rc= $tmp1targetProxies.Add($proxy)
}
else
{
$rc= $tmp2targetProxies.Add($proxy)
}
}
# Join arrays
$targetProxies = $tmp1targetProxies
$rc = $targetProxies.AddRange($tmp2targetProxies)
}
}
# Add target LegDN as X500 to mail enabled proxy collection
$tempX500 = New-Object Microsoft.Exchange.Data.CustomProxyAddress "x500", $targetUser.legacyExchangeDN, $false
# checks if value already exists in collection
if (!$targetProxies.Contains($tempX500))
{
$rc= $targetProxies.Add($tempX500)
log "$($thisSourceAlias)" "Proxy: $($tempX500) added to the collection"
}
else
{
log "$($thisSourceAlias)" "Proxy: $($tempX500) already exists in collection"
}
# stamp proxies to mail enabled user
#$targetProxies.Count
if ($targetProxies.Count -gt 0)
{
log "$($thisSourceAlias)" "Going to stamp EmailAddresses: $targetProxies to User: $($thissourceID)"
$error.Clear()
set-MailUser -Identity $thissourceID -EmailAddresses $targetProxies -ErrorAction SilentlyContinue -DomainController $_.SourceDomainController
if (![String]::IsNullorEmpty($error[0]))
{
logExit "$($thisSourceAlias)" "Cleanup for User: $($thissourceID) was not successful. Step: set-MailUser. Error= $($error[0])."
echo "Cleanup for User: $($thissourceID) was not successful. Step: set-MailUser. Error= $($error[0])."
}
else
{
log "$($thisSourceAlias)" "Set-MailUser of EmailAddresses for $($thissourceID) was successful"
}
}
$thisMailUser = get-MailUser -Identity $thissourceID -ErrorAction SilentlyContinue -DomainController $_.SourceDomainController
log "$($thisSourceAlias)" "Source Mailuser ID: $($thisMailUser.Identity)"
log "$($thisSourceAlias)" "Source Mailuser DisplayName: $($thisMailUser.DisplayName)"
log "$($thisSourceAlias)" "Source Mailuser ExternalEmailAddress: $($thisMailUser.ExternalEmailAddress)"
log "$($thisSourceAlias)" "Source Mailuser PrimarySMTP: $($thisMailUser.PrimarySmtpAddress)"
log "$($thisSourceAlias)" "Source Mailuser EmailAddresses: $($thisMailUser.EmailAddresses)"
log "$($thisSourceAlias)" "Migration and cleanup for user $($thisSourceAlias) was completed successfuly."
echo "Migration and cleanup for user $($thisSourceAlias) was completed successfuly."
trap
{
"Error ="+$_.Message
}
}
else
{
logExit "$($thisSourceAlias)" "Can't mail enable this user because current Recipient type: $($rc.RecipientType)"
echo "Can't mail enable user $($thisSourceAlias) because current Recipient type: $($rc.RecipientType)"
}
}
}
elseif ($SourceMailboxCleanupOptions -eq "DeleteSourceNTAccount")
{
# grab newly created mailbox
$error.Clear()
$targetUser = get-mailbox -Identity "$($thisSourceAlias)" -DomainController $DomainController -ErrorAction SilentlyContinue -Credential $TargetForestCredential
if ($targetUser -eq $null)
{
logExit "$($thisSourceAlias)" "Cleanup for User: $($_.Identity) was not successful. Step: get-mailbox. Error= $($error[0])."
}
# browse through target addresses to find out new primary
foreach ($temp in $targetUser.EmailAddresses)
{
if ( ($temp.isPrimaryAddress -eq $true) -and ($temp.Prefix -ilike "SMTP"))
{
# Primary SMTP
$targetSMTP = [String]$temp.ToString()
$targetSMTPString = $temp.get_AddressString()
}
}
if ([String]::IsNullorEmpty($targetSMTP) )
{
# checks if TargetSMTPDomain was passed
if ([String]::IsNullorEmpty($TargetSMTPDomain) )
{
logExit "$($thisSourceAlias)" "Cleanup for User: $($_.Identity) was not successful. Step: Get primary SMTP address. If the target server is an Exchange 2003 server please use the parameter -TargetSMTPDomain."
}
else
{
$targetSMTP = $thissourceAlias+"@"+$TargetSMTPDomain
$targetSMTPString = $targetSMTP
}
}
log "$($thisSourceAlias)" "Target Mailbox SMTP: $($targetSMTP)"
# Creates Contact
$error.Clear()
$sourceContact = New-MailContact -Name "$($thisSourceDisplayName)" -Alias "$($thissourceAlias)" -ExternalEmailAddress $targetSMTP -OrganizationalUnit $ContactsOU -DomainController $_.SourceDomainController -ErrorAction SilentlyContinue
if ($sourceContact -eq $null)
{
logExit "$($thisSourceAlias)" "Cleanup for User: $($_.Identity) was not successful. Step: New-MailContact. Error= $($error[0])."
echo "Cleanup for User: $($_.Identity) was not successful. Step: New-MailContact. Error= $($error[0])."
}
else
{
log "$($thisSourceAlias)" "Contact: $($sourceContact.Identity) has been created"
}
log "$($thisSourceAlias)" "Source Contact EmailAddresses: $($sourceContact.EmailAddresses)"
# use target primary as external address for contact and save all target proxies to collection
$targetProxies = new-object System.Collections.ArrayList
$tmp1targetProxies = new-object System.Collections.ArrayList
$tmp2targetProxies = new-object System.Collections.ArrayList
# start by copying current addresses
$targetProxies = $sourceContact.EmailAddresses
# Add proxies from original source mailbox to mail enabled user proxy collection
foreach ($temp in $thisSourceAddresses)
{
if ( ($temp.isPrimaryAddress -eq $true) )
{
# Change all primaries to secondaries
$newProxy = $temp.ToSecondary()
}
else
{
$newProxy = $temp
}
# checks if value already exists in collection
if (!$targetProxies.Contains($newProxy))
{
$rc = $targetProxies.Add($newProxy)
}
else
{
#log "$($thisSourceAlias)" "Proxy: $newProxy already exists in collection"
}
}
# Tries to Add target SMTP to proxy collection (it is necessary if address was calculated for a Ti target server)
$tempPrimary = New-Object Microsoft.Exchange.Data.CustomProxyAddress "SMTP", $targetSMTPString, $true
# checks if value already exists in collection
if (!$targetProxies.Contains($tempPrimary))
{
# we need to insert this address as the first in the list, otherwise it will not be primary
$rc = $tmp1targetProxies.Add($tempPrimary)
$rc = $tmp1targetProxies.AddRange($targetProxies)
$targetProxies=$tmp1targetProxies
}
else
{
log "$($thisSourceAlias)" "Proxy: $($tempPrimary) already exists in collection"
# Ensures Primary is first on list
[Int]$PrimaryIndex = $targetProxies.IndexOf($tempPrimary)
if (!$PrimaryIndex -eq 0)
{
# Primary is not first, so we need to reorder array
# Splt Primary and other proxies add them to separate arrays
foreach ($proxy in $targetProxies)
{
if ( ($proxy.isPrimaryAddress -eq $true) -and ($proxy.Prefix -ilike "SMTP"))
{
$rc = $tmp1targetProxies.Add($proxy)
}
else
{
$rc = $tmp2targetProxies.Add($proxy)
}
}
# Join arrays
$targetProxies = $tmp1targetProxies
$rc = $targetProxies.AddRange($tmp2targetProxies)
}
}
# Add target LegDN as X500 to mail enabled proxy collection
$tempX500 = New-Object Microsoft.Exchange.Data.CustomProxyAddress "x500", $targetUser.legacyExchangeDN, $false
# checks if value already exists in collection
if (!$targetProxies.Contains($tempX500))
{
$rc = $targetProxies.Add($tempX500)
log "$($thisSourceAlias)" "Proxy: $($tempX500) added to the collection"
}
else
{
log "$($thisSourceAlias)" "Proxy: $($tempX500) already exists in collection"
}
# stamp proxies to contact
if ($targetProxies.Count -gt 0)
{
log "$($thisSourceAlias)" "Going to stamp EmailAddresses: $targetProxies to Contact: $($sourceContact.Identity)"
$error.Clear()
set-MailContact -Identity "$($sourceContact.Identity)" -EmailAddresses $targetProxies -ErrorAction SilentlyContinue -DomainController $_.SourceDomainController
if (![String]::IsNullorEmpty($error[0]))
{
logExit "$($thisSourceAlias)" "Cleanup for User: $($_.Identity) was not successful. Step: set-MailContact. Error= $($error[0])."
echo "Cleanup for User: $($_.Identity) was not successful. Step: set-MailContact. Error= $($error[0])."
}
else
{
log "$($thisSourceAlias)" "Set-MailContact of EmailAddresses for $($sourceContact.Identity) was successful"
}
}
# Update other AD attributes for contact
$error.Clear()
set-contact -Identity "$($sourceContact.Identity)" -FirstName "$($thissourceFirstName)" -LastName "$($thissourceLastName)" -DisplayName "$($thissourceDisplayName)" -ErrorAction SilentlyContinue -DomainController $_.SourceDomainController
if (![String]::IsNullorEmpty($error[0]))
{
logExit "$($thisSourceAlias)" "Cleanup for User: $($_.Identity) was not successful. Step: set-Contact. Error= $($error[0])."
echo "Cleanup for User: $($_.Identity) was not successful. Step: set-Contact. Error= $($error[0])."
}
trap
{
"Error ="+$_.Message
}
$thisMailContact = get-MailContact -Identity "$($sourceContact.Identity)" -ErrorAction SilentlyContinue -DomainController $_.SourceDomainController
log "$($thisSourceAlias)" "Source Contact ID: $($thisMailContact.Identity)"
log "$($thisSourceAlias)" "Source Contact DisplayName: $($thisMailContact.DisplayName)"
log "$($thisSourceAlias)" "Source Contact ExternalEmailAddress: $($thisMailContact.ExternalEmailAddress)"
log "$($thisSourceAlias)" "Source Contact PrimarySMTP: $($thisMailContact.PrimarySmtpAddress)"
log "$($thisSourceAlias)" "Source Contact EmailAddresses: $($thisMailContact.EmailAddresses)"
log "$($thisSourceAlias)" "Migration and cleanup for user $($thisSourceAlias) was completed successfuly."
echo "Migration and cleanup for user $($thisSourceAlias) was completed successfuly."
}
else
{
# no cleanup necessary
logExit "$($thisSourceAlias)" "No cleanup necessary for Mailbox User: $thissourceID"
echo "No cleanup necessary for Mailbox User: $thissourceID"
}
}
$WarningPreference="Continue"
logExit "Terminating" "Finished Migration Script. Please check $($file_name) for details."
############################################################ Main Script Block END ################################################################