In most cases you uninstall your local Exchange server after migrating your e-mail to Exchange Online. If you also choose to implement DirSync you place the administration in your local domain instead of the Office 365 Administration Portal.
This means that there is no longer a GUI tool to handle some of the settings related to your mailboxes. Of course you can keep a machine with your old Exchange 2010 Management Console, but often the reason for moving to the cloud is to reduce the complexity and minimize the number of machines.
We don’t have the same problem with other attributes, for example displayname or phone numbers that you’ll find in Users and Computers or the Administrative Center introduced in Windows Server 2008. It does get a bit trickier when you are about to modify primary email address or add alias addresses.
Currently there are no available GUI tools from Microsoft to handle these types of updates easy (but keep your eyes open, things might change 😉 ). However, there are a few third-party tools to achieve this, unless you want to use the Attribute Editor in Users and Computers, or Adsiedit.
Since I’m a big fan of PowerShell I wanted to build a small set of tools to handle simple changes of email addresses. These functions are easy for you to use in your own scripts.
First of all, a function that lists all email addresses of a user:
function Get-O365AliasAddress { <# .SYNOPSIS Displays all email addresses assigned to a user. .PARAMETER Identity The user to query. .EXAMPLE Get-O365AliasAddress -Identity user01 .EXAMPLE Get-ADUser user01 | Get-O365AliasAddress .NOTES Author: Andreas Lindahl Blog: 365lab.net Email: andreas.lindahl[at]jsc.se The script are provided “AS IS” with no guarantees, no warranties, and they confer no rights. #> [CmdletBinding()] param ( [Parameter(ValueFromPipelineByPropertyName=$true,Mandatory=$True,ValueFromPipeline=$True, HelpMessage="The name of the user to get addresses of")] [string]$Identity ) Import-Module ActiveDirectory $result = @() (Get-ADUser -Identity $Identity -Properties proxyAddresses).proxyAddresses | foreach { $proxy = $_.split(":") $object = New-Object System.Object $object | Add-Member –Type NoteProperty –Name Type –Value $proxy[0] $object | Add-Member –Type NoteProperty –Name Address –Value $proxy[1] $object | Add-Member –Type NoteProperty –Name IsPrimary –Value ($proxy[0] -ceq $($proxy[0].ToUpper())) $result += $object } return $result }
Next, a function that adds an alias to an existing user
function Add-O365AliasAddress { <# .SYNOPSIS Adds an alias address to a user. .PARAMETER Identity The user to modify. .PARAMETER Address The address to add. .PARAMETER Type The type of address. Default is smtp. .PARAMETER SetAsDefault Indicates if the address should be de default address of the user .EXAMPLE Add-O365AliasAddress -Identity user01 -Address test@365lab.net -SetAsPrimary .NOTES Author: Andreas Lindahl Blog: 365lab.net Email: andreas.lindahl[at]jsc.se The script are provided “AS IS” with no guarantees, no warranties, and they confer no rights. #> [CmdletBinding()] param ( [Parameter(ValueFromPipelineByPropertyName=$true,Mandatory=$True,ValueFromPipeline=$True, HelpMessage="The name of the user")] [string]$Identity, [Parameter(Mandatory=$True, HelpMessage="The address to add")] [string]$Address, [Parameter( HelpMessage="The type of the address to add")] [string]$Type="smtp", [Parameter( HelpMessage="Indicates that the address will be set as the default address")] [switch]$SetAsDefault ) Import-Module ActiveDirectory $Type = $Type.ToLower() $defaultaddress = '' $proxyaddresses = '' $proxyaddress = '' #Get all existing proxyAddresses of the same type $proxyaddresses = (Get-ADUser -Identity $Identity -Properties proxyAddresses).proxyAddresses | where-object { $_ -like "$Type*" } #Get current default address of this type foreach ($proxyaddress in $proxyaddresses) { $pa = $proxyaddress.split(':') if ($pa[0] -ceq $pa[0].ToUpper()) { $defaultaddress = $proxyaddress } } #If this is the first address, it will be the default if ($proxyaddresses.count -eq 0) { $SetAsDefault = $true } if ($SetAsDefault) { #New default address to set. Start by removing the old one, but keep it as alias. if ($defaultaddress) { $pa = $defaultaddress.split(':') $newdefaultaddress = "$($pa[0].ToLower()):$($pa[1])" Set-ADUser -Identity $Identity -Remove @{proxyaddresses=$defaultaddress} -Add @{proxyaddresses=$newdefaultaddress} } #Set new default address. In case it already exists, remove it first (it might already be used as alias) if ($Type -eq 'SMTP') { Set-ADUser -Identity $Identity -Remove @{proxyaddresses="$($Type.ToLower()):$Address" } -Add @{proxyaddresses="$($Type.ToUpper()):$Address" } -EmailAddress $Address } else { Set-ADUser -Identity $Identity -Remove @{proxyaddresses="$($Type.ToLower()):$Address" } -Add @{proxyaddresses="$($Type.ToUpper()):$Address" } } } else { #Just add the new address Set-ADUser -Identity $Identity -Add @{proxyaddresses="$($Type):$Address" } } }
Finally we also need a script to delete addresses
function Remove-O365AliasAddress { <# .SYNOPSIS Removes an alias address from a user. .PARAMETER Identity The user to modify. .PARAMETER Address The address to remove. .PARAMETER Type The type of address. Default is smtp. .EXAMPLE Remove-O365AliasAddress -Identity user01 -Address test@365lab.net .NOTES Author: Andreas Lindahl Blog: 365lab.net Email: andreas.lindahl[at]jsc.se The script are provided “AS IS” with no guarantees, no warranties, and they confer no rights. #> [CmdletBinding()] param ( [Parameter(ValueFromPipelineByPropertyName=$true,Mandatory=$True,ValueFromPipeline=$True, HelpMessage="The name of the user")] [string]$Identity, [Parameter(Mandatory=$True, HelpMessage="The address to remove")] [string]$Address, [Parameter( HelpMessage="The type of the address to remove")] [string]$Type="smtp" ) Import-Module ActiveDirectory $Type = $Type.ToLower() $defaultaddress = '' $newdefaultaddress = '' $proxyaddresses = '' #Get all existing proxyAddresses of the same type $proxyaddresses = (Get-ADUser -Identity $Identity -Properties proxyAddresses).proxyAddresses | where-object { $_ -like "$Type*" } #Get current default address of this type foreach ($proxyaddress in $proxyaddresses) { $pa = $proxyaddress.split(':') if ($pa[0] -ceq $pa[0].ToUpper()) { $defaultaddress = $proxyaddress } } if ($defaultaddress -eq "$($Type):$Address") { #We are trying to remove the default address. Now it becomes a bit tricky... #First, find the next address of the same type that we can use as default address foreach ($proxyaddress in $proxyaddresses) { if ($proxyaddress -ne "$($Type):$Address") { $newdefaultaddress = $proxyaddress break } } } #Now we can remove the address Set-ADUser -Identity $Identity -Remove @{proxyaddresses="$($Type):$Address"} if ($Type -eq 'smtp' -and $defaultaddress -eq "$($Type):$Address") { Set-ADUser -Identity $Identity -Clear mail } if ($newdefaultaddress) { #Set $newdefaultaddress as new default address Write-Warning "New default address set: $newdefaultaddress" Add-O365AliasAddress -Identity $Identity -Address $newdefaultaddress.split(":")[1] -Type $Type -SetAsDefault } }
Now we can play with these functions:
I have put together a PowerShell Module for you to import. Just load it with the Import-Module cmdlet.
Import-Module O365ProxyAddresses
The module can be downloaded here.
I hope that you will find these functions useful in your daily user administration tasks. Please leave your comments below and feel free to suggest improvements.
Happy coding!
/ Andreas