UPDATE: This script has been moved to the PowerShell Gallery.  All future updates will be posted here: https://www.powershellgallery.com/packages/Set-UpnWithMailAddress/

If you have ever been faced with the dilemma of updating UPNs to match Email Addresses for the purpose of deploying Office 365, this may be what you need. 

Frequently, I have encountered situtions where the email address format may be something like first.last@domain.com, but the user principal name is FirstInitialLastName@domain.local.  This script will copy the email address field of users into the UPN field.

Requires Active Directory PowerShell cmdlets to run.  Supports -SearchBase and -SearchScope parameters, so you can now limit your queries.  Also sports a shiny new -OnlyMailboxes parameter, so you don't end up updating UPNs for mail-enabled users accidentally.

Updates

Previous Updates

PowerShell
Edit|Remove
<# 
Replace UserPrincipalName with Mail attribute 
 
All envrionments perform differently. Please test this code before using it 
in production. 
 
THIS CODE AND ANY ASSOCIATED INFORMATION ARE PROVIDED “AS IS” WITHOUT WARRANTY  
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE  
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR 
PURPOSE. THE ENTIRE RISK OF USE, INABILITY TO USE, OR RESULTS FROM THE USE OF  
THIS CODE REMAINS WITH THE USER. 
 
Author: Aaron Guilmette 
        aaron.guilmette@microsoft.com 
#> 
 
<# 
.SYNOPSIS 
Replace UserPrincipalName with Mail attribute. 
 
.DESCRIPTION 
This script will replace the UPN of the target object with the value 
in its mail attribute.  This can be useful if parity between the 
User Principal Name and email address is necessary (such as single 
sign-on scenarios with Office 365). 
 
.EXAMPLE 
.\Set-UpnWithMailAddress.ps1 -TargetUser testuser@contoso.com 
Replace UPN with mail attribute for user testuser@contoso.com. 
 
.EXAMPLE 
.\Set-UpnWithMailAddress.ps1 -TargetUser * 
Replace UPN with mail attribute for all users. 
 
.EXAMPLE 
.\Set-UpnWithMailAddress.ps1 -TargetUser * -SearchBase "OU=Test,DC=contoso,DC=com" -LogFile Log.txt 
Replace UPN with mail attribute for all users in organizational unit Test  
and log results to log.txt 
 
.EXAMPLE 
.\Set-UpnWithMailAddress.ps1 -TargetUser * -OnlyMailboxes 
Replace UPN with mail attribute for mailbox users only (exclude mail- 
enabled users). 
 
.PARAMETER ErrorLog 
Specify logfile for errors.  Default is <date>_UPNUpdateError.txt. 
 
.PARAMETER Logfile 
Specify logfile for operations. Default is <date>_UPNUpdate.txt 
 
.PARAMETER OnlyMailboxes 
Ignore MailUser objects, based on msExchRecipientTypeDetails value. If 
the environment has MailUsers, it may not be desirable to overwrite the 
UserPrincipalName with the external mail attribute, since the external 
mail address will most likely be for a domain not bound to the current 
organization. 
 
.PARAMETER SearchBase 
Set the BaseDN for the search query.  Defaults to the DN of the current 
domain. 
 
.PARAMETER SearchScope 
Set the search scope for Active Directory Operations. 
 
.PARAMETER TargetUser 
This parameter is used to identify the user or group of users on which  
the attributes will be updated. Can be a single UPN or a wildcard to 
select all users in current domain. 
 
.LINK 
http://gallery.technet.microsoft.com/Set-Upn-With-Mail-Address-c4d0ee60 
 
.LINK 
http://aka.ms/thebookonit 
 
.NOTES 
2019-04-25    Added objectGUID to log file. 
            Reduced number of Get- calls to improve performance. 
            Added on-screen progress meter for large batches. 
2018-05-17    Updated logging parameters. 
2016-08-30    Added -OnlyMailboxes parameter. 
2014-08-02    Initial release. 
#>