The Script
Notice that because this script runs against multiple versions of Exchange. I attempt to cover the three major revisions of Exchange – Exchange 2007, Exchange 2010-2013 (pre MAPI), Exchange 2013/2016. The last category may be split depending.
<# .SYNOPSIS Configured the Exchange Virtual Directory URLs for client access. .DESCRIPTION This script will configure Exchange URLs based on the version of the Exchange Server the script is run against. .NOTES Version : 1.1 Change Log : 1.1 - Tweaks to the look, operation and correct some syntax errors after testing on 2007, 2010, 2013, 2016 : 1.0 - Base script Wish list : Rights Required : Local admin on server Sched Task Req'd : No Exchange Version : 2007-2016 Author : Damian Scoles Dedicated Blog : http://justaucguy.wordpress.com/ Disclaimer : You are on your own. This was not written by, support by, or endorsed by Microsoft. Info Stolen from : .LINK [TBD] Example .\Set-ExchangeURLs1.0.ps1 .INPUTS None. You cannot pipe objects to this script. .Notes Requires - Version 2.0+ #> # Clear variables $global:internalurl = $null $global:externalurl = $null function Notice { cls write-host "For this first part, you need to chose the URLs to be used by OWA, Smart Phones, Outlook, etc." -ForegroundColor cyan start-sleep 4 } function Notice2 { cls write-host "For the second part, you will assign names to various virtual directories." -ForegroundColor cyan start-sleep 6 } Function GetURLs { cls Clear-Host Pushd [string] $menu = @' ************************************* Exchange URLs - Internal and External ************************************* Please select an option from the list below. 1) Set Internal URL 2) Set External URL 3) Set Internal & External URLs 99) Exit Select an option.. [1-99]? '@ function InternalURL { $global:internal = Read-Host 'Enter the URL you want to use for your Exchange internal URLs.' } function ExternalURL { $global:external = Read-Host 'Enter the URL you want to use for your Exchange external URLs.' } function BothURL { $global:internal = Read-Host 'Enter the URL you want to use for your Exchange internal and external URLs.' $global:external = $global:internal } Do { if ($opt -ne "None") {Write-Host "Last command: "$opt -foregroundcolor Yellow} $opt = Read-Host $menu switch ($opt) { 1 { # Gather the FQDN for internal URLs InternalURL } 2 { # Gather the FQDN for external URLs ExternalURL } 3 { # Gather the FQDN for both internal and external URLs BOTHUrl } 99 {# Exit if ($global:internal -ne $null) { write-host " ";write-host "The internal URL you have chosen is: " -nonewline -foregroundcolor white;write-host "$global:internal" -foregroundcolor yellow;write-host " " } else { write-host " ";write-host "You have not set an internal URL.";write-host " " } if ($global:external -ne $null) { write-host "The external URL you have chosen is: " -nonewline -foregroundcolor white;write-host "$global:external" -foregroundcolor yellow;write-host " " } else { write-host "You have not set an external URL.";write-host " " } } default {Write-Host "You haven't selected any of the available options. "} } } while ($opt -ne 99) } $error.clear() function VersionCheck { $ver = GCM exsetup |%{$_.Fileversioninfo} $FVN= $ver.fileversion # Reserved for future Exchange 2016 Configurations # if (($fvn -gt "15.0.775.38") -and ($fvn -lt "15.1")) { # write-host "Exchange 2013 SP1+ but not 2016" # } if ($FVN -gt "15.0.775.38") { $global:state = "MAPI" } if (($FVN -like "14") -or ($FVN -like "15")) { if ($FVN -lt "15.0.847.32") { $global:state = "NOMAPI" } } if ($FVN -lt "14.0.000.00") { $global:state = "2007" } } # Call all functions Notice GetURLs $global:srvname = $env:computername VersionCheck Notice2 # Check if ($state -eq "2007") { Clear-Host Pushd $server = $global:srvname [string] $menu = @' **************************************** Exchange Server 2007 URL Configuration **************************************** Please select an option from the list below. 1) Configure all URLS [OWA, OAB, WebServices, AutoDiscover URI, ActiveSync] 2) Configure OWA URL 3) Configure OAB URL 4) Configure WebServices (EWS) URL 5) Configure ActiveSync URL 6) Configure AutoDiscover URI 7) Configure Outlook Anywhere 99) Exit Select an option.. [1-99]? '@ function AllUrls { Set-WebServicesVirtualDirectory -Identity "$server\EWS (Default Web Site)" -internalurl https://$global:internal/ews/exchange.asmx -externalurl https://$global:external/ews/exchange.asmx set-OWAVirtualDirectory -Identity "$server\owa (Default Web Site)" -InternalURL https://$global:internal/owa -externalurl https://$global:external/owa Set-ActiveSyncVirtualDirectory -Identity "$server\Microsoft-Server-ActiveSync (Default Web Site)" -InternalURL https://$global:internal/Microsoft-Server-ActiveSync -externalurl https://$global:external/Microsoft-Server-ActiveSync Set-OabVirtualDirectory -Identity "$server\OAB (Default Web Site)" -InternalURL https://$global:internal/oab -externalurl https://$global:external/oab set-clientaccessserver $server -AutoDiscoverServiceInternalUri https://$global:external/autodiscover/autodiscover.xml } function OWAUrl { set-OWAVirtualDirectory -Identity "$server\owa (Default Web Site)" -InternalURL https://$global:internal/owa -externalurl https://$global:external/owa } function OABUrl { Set-OabVirtualDirectory -Identity "$server\OAB (Default Web Site)" -InternalURL https://$global:internal/oab -externalurl https://$global:external/oab } function EWSUrl { Set-WebServicesVirtualDirectory -Identity "$server\EWS (Default Web Site)" -internalurl https://$global:internal/ews/exchange.asmx -externalurl https://$global:external/ews/exchange.asmx } function EASUrl { Set-ActiveSyncVirtualDirectory -Identity "$server\Microsoft-Server-ActiveSync (Default Web Site)" -InternalURL https://$global:internal/Microsoft-Server-ActiveSync -externalurl https://$global:external/Microsoft-Server-ActiveSync } function URI { set-clientaccessserver $server -AutoDiscoverServiceInternalUri https://$global:external/autodiscover/autodiscover.xml } function OutlookAnywhere { CLS $OAAuth = read-host "What Outlook Anywhere Authentication do you want to configure - (1) NTLM or (2) Basic" if ($oaauth -eq "1") {$auth ="NTLM" } if ($oaauth -eq "2") {$auth ="Basic" } $SSLOffloading = read-host "Turn on SSL Offloading - (1) True or (2) False" if ($SSLOffloading -eq "1") {$SSL = $true } if ($SSLOffloading -eq "2") {$SSL = $false } set-outlookanywhere -Identity "$server\rpc (Default Web Site)" -ClientAuthenticationMethod $auth -IISAuthenticationMethods Basic,NTLM -ExternalHostname $global:external -SSLOffloading $ssl } Do { if ($opt -ne "None") {Write-Host "Last command: "$opt -foregroundcolor Yellow} $opt = Read-Host $menu switch ($opt) { 1 { # All URLs AllUrls } 2 { # Outlook Web Access URL OWAUrl } 3 { # Offline Address Book URL OABUrl } 4 { # Web Services URL EWSUrl } 5 { # Exchange ActiveSync URL EASUrl } 6 { # AutoDiscover URI Configuration } 7 { # Configure Outlook Anywhere OutlookAnywhere } 99 { # Exit } } } while ($opt -ne 99) } if ($state -eq "NOMAPI") { Clear-Host Pushd $server = $global:srvname [string] $menu = @' ****************************************************************** Exchange Server 2010 to Pre Exchange 2013 SP1 URL Configuration ****************************************************************** Please select an option from the list below. 1) Configure all URLS [OWA, OAB, WebServices, AutoDiscover URI, ActiveSync, ECP, PowerShell] 2) Configure OWA URL 3) Configure OAB URL 4) Configure WebServices (EWS) URL 5) Configure ActiveSync URL 6) Configure AutoDiscover URI 7) Configure ECP URL (*) 8) Configure Outlook Anywhere 9) Configure PowerShell URL 99) Exit Select an option.. [1-99]? '@ function AllUrls { Set-WebServicesVirtualDirectory -Identity "$server\EWS (Default Web Site)" -internalurl https://$global:internal/ews/exchange.asmx -externalurl https://$global:external/ews/exchange.asmx set-OWAVirtualDirectory -Identity "$server\owa (Default Web Site)" -InternalURL https://$global:internal/owa -externalurl https://$global:external/owa Set-ActiveSyncVirtualDirectory -Identity "$server\Microsoft-Server-ActiveSync (Default Web Site)" -InternalURL https://$global:internal/Microsoft-Server-ActiveSync -externalurl https://$global:external/Microsoft-Server-ActiveSync Set-OabVirtualDirectory -Identity "$server\OAB (Default Web Site)" -InternalURL https://$global:internal/oab -externalurl https://$global:external/oab set-clientaccessserver $server -AutoDiscoverServiceInternalUri https://$global:external/autodiscover/autodiscover.xml Set-EcpVirtualDirectory -Identity "$server\ecp (Default Web Site)" -InternalURL https://$global:internal/ecp -externalurl https://$global:external/ecp Set-MAPIVirtualDirectory -Identity "$server\MAPI (Default Web Site)" -InternalURL https://$global:internal/MAPI -externalurl https://$global:external/MAPI Set-PowerShellVirtualDirectory -Identity "$server\PowerShell (Default Web Site)" -InternalURL https://$global:internal/Powershell -externalurl https://$global:external/PowerShell } function OWAUrl { set-OWAVirtualDirectory -Identity "$server\owa (Default Web Site)" -InternalURL https://$global:internal/owa -externalurl https://$global:external/owa } function OABUrl { Set-OabVirtualDirectory -Identity "$server\OAB (Default Web Site)" -InternalURL https://$global:internal/oab -externalurl https://$global:external/oab } function EWSUrl { Set-WebServicesVirtualDirectory -Identity "$server\EWS (Default Web Site)" -internalurl https://$global:internal/ews/exchange.asmx -externalurl https://$global:external/ews/exchange.asmx } function EASUrl { Set-ActiveSyncVirtualDirectory -Identity "$server\Microsoft-Server-ActiveSync (Default Web Site)" -InternalURL https://$global:internal/Microsoft-Server-ActiveSync -externalurl https://$global:external/Microsoft-Server-ActiveSync } function URI { set-clientaccessserver $server -AutoDiscoverServiceInternalUri https://$global:external/autodiscover/autodiscover.xml } function OutlookAnywhere { CLS $OAAuth = read-host "What Outlook Anywhere Authentication do you want to configure - (1) NTLM or (2) Basic" if ($oaauth -eq "1") {$auth ="NTLM" } if ($oaauth -eq "2") {$auth ="Basic" } $RequireSSLe = read-host "Require SSL Encryption for External Clients - (1) Yes or (2) No" $RequireSSLi = read-host "Require SSL Encryption for Internal Clients - (1) Yes or (2) No" if ($RequireSSLe -eq "1") { $extSSL = $true } if ($RequireSSLe -eq "2") { $extSSL = $false } if ($RequireSSLi -eq "1") { $intSSL = $true } if ($RequireSSLi -eq "2") { $intSSL = $false } $SSLOffloading = read-host "Turn on SSL Offloading - (1) True or (2) False" if ($SSLOffloading -eq "1") {$SSL = $true } if ($SSLOffloading -eq "2") {$SSL = $false } set-outlookanywhere -Identity "$server\rpc (Default Web Site)" -ExternalClientAuthenticationMethod $auth -InternalClientAuthenticationMethod $auth -IISAuthenticationMethods Basic,NTLM -ExternalHostname $global:external -InternalHostname $global:internal -ExternalClientsRequireSsl $extSSL -InternalClientsRequireSsl $intSSL } Do { if ($opt -ne "None") {Write-Host "Last command: "$opt -foregroundcolor Yellow} $opt = Read-Host $menu switch ($opt) { 1 { # All URLs AllUrls } 2 { # Outlook Web Access URL OWAUrl } 3 { # Offline Address Book URL OABUrl } 4 { # Web Services URL EWSUrl } 5 { # Exchange ActiveSync URL EASUrl } 6 { # AutoDiscover URI Configuration URI } 7 { # Exchange Control Panel URL ECPUrl } 8 { # Configure Outlook Anywhere OutlookAnywhere } 10 { # PowerShell URL PowerShellUrl } 99 {# Exit } } } while ($opt -ne 99) } if ($state -eq "MAPI") { Clear-Host Pushd $server = $global:srvname [string] $menu = @' ********************************************* Exchange Server 2013 SP1+ URL Configuration ********************************************* Please select an option from the list below. 1) Configure all URLS [OWA, OAB, WebServices, AutoDiscover URI, ActiveSync, ECP, MAPI, PowerShell] 2) Configure OWA URL 3) Configure OAB URL 4) Configure WebServices (EWS) URL 5) Configure ActiveSync URL 6) Configure AutoDiscover URI 7) Configure ECP URL (*) 8) Configure MAPI URL (**) 9) Configure Outlook Anywhere 10) Configure PowerShell URL 99) Exit Select an option.. [1-99]? '@ function AllUrls { Set-WebServicesVirtualDirectory -Identity "$server\EWS (Default Web Site)" -internalurl https://$global:internal/ews/exchange.asmx -externalurl https://$global:external/ews/exchange.asmx set-OWAVirtualDirectory -Identity "$server\owa (Default Web Site)" -InternalURL https://$global:internal/owa -externalurl https://$global:external/owa Set-ActiveSyncVirtualDirectory -Identity "$server\Microsoft-Server-ActiveSync (Default Web Site)" -InternalURL https://$global:internal/Microsoft-Server-ActiveSync -externalurl https://$global:external/Microsoft-Server-ActiveSync Set-OabVirtualDirectory -Identity "$server\OAB (Default Web Site)" -InternalURL https://$global:internal/oab -externalurl https://$global:external/oab set-clientaccessserver $server -AutoDiscoverServiceInternalUri https://$global:external/autodiscover/autodiscover.xml Set-EcpVirtualDirectory -Identity "$server\ecp (Default Web Site)" -InternalURL https://$global:internal/ecp -externalurl https://$global:external/ecp Set-MAPIVirtualDirectory -Identity "$server\MAPI (Default Web Site)" -InternalURL https://$global:internal/MAPI -externalurl https://$global:external/MAPI Set-PowerShellVirtualDirectory -Identity "$server\PowerShell (Default Web Site)" -InternalURL https://$global:internal/Powershell -externalurl https://$global:external/PowerShell } function OWAUrl { set-OWAVirtualDirectory -Identity "$server\owa (Default Web Site)" -InternalURL https://$global:internal/owa -externalurl https://$global:external/owa } function OABUrl { Set-OabVirtualDirectory -Identity "$server\OAB (Default Web Site)" -InternalURL https://$global:internal/oab -externalurl https://$global:external/oab } function EWSUrl { Set-WebServicesVirtualDirectory -Identity "$server\EWS (Default Web Site)" -internalurl https://$global:internal/ews/exchange.asmx -externalurl https://$global:external/ews/exchange.asmx } function EASUrl { Set-ActiveSyncVirtualDirectory -Identity "$server\Microsoft-Server-ActiveSync (Default Web Site)" -InternalURL https://$global:internal/Microsoft-Server-ActiveSync -externalurl https://$global:external/Microsoft-Server-ActiveSync } function URI { set-clientaccessserver $server -AutoDiscoverServiceInternalUri https://$global:external/autodiscover/autodiscover.xml } function ECPUrl { Set-EcpVirtualDirectory -Identity "$server\ecp (Default Web Site)" -InternalURL https://$global:internal/ecp -externalurl https://$global:external/ecp } function Mapiurl { Set-MAPIVirtualDirectory -Identity "$server\MAPI (Default Web Site)" -InternalURL https://$global:internal/MAPI -externalurl https://$global:external/MAPI } function OutlookAnywhere { CLS $OAAuth = read-host "What Outlook Anywhere Authentication do you want to configure - (1) NTLM or (2) Basic" if ($oaauth -eq "1") {$auth ="NTLM" } if ($oaauth -eq "2") {$auth ="Basic" } $RequireSSLe = read-host "Require SSL Encryption for External Clients - (1) Yes or (2) No" $RequireSSLi = read-host "Require SSL Encryption for Internal Clients - (1) Yes or (2) No" if ($RequireSSLe -eq "1") { $extSSL = $true } if ($RequireSSLe -eq "2") { $extSSL = $false } if ($RequireSSLi -eq "1") { $intSSL = $true } if ($RequireSSLi -eq "2") { $intSSL = $false } $SSLOffloading = read-host "Turn on SSL Offloading - (1) True or (2) False" if ($SSLOffloading -eq "1") {$SSL = $true } if ($SSLOffloading -eq "2") {$SSL = $false } set-outlookanywhere -Identity "$server\rpc (Default Web Site)" -ExternalClientAuthenticationMethod $auth -InternalClientAuthenticationMethod $auth -IISAuthenticationMethods Basic,NTLM -ExternalHostname $global:external -InternalHostname $global:internal -ExternalClientsRequireSsl $extSSL -InternalClientsRequireSsl $intSSL } function Powershellurl { Set-PowerShellVirtualDirectory -Identity "$server\PowerShell (Default Web Site)" -InternalURL https://$global:internal/Powershell -externalurl https://$global:external/PowerShell } Do { if ($opt -ne "None") {Write-Host "Last command: "$opt -foregroundcolor Yellow} $opt = Read-Host $menu switch ($opt) { 1 { # All URLs AllUrls } 2 { # Outlook Web Access URL OWAUrl } 3 { # Offline Address Book URL OABUrl } 4 { # Web Services URL EWSUrl } 5 { # Exchange ActiveSync URL EASUrl } 6 { # AutoDiscover URI Configuration URI } 7 { # Exchange Control Panel URL ECPUrl } 8 { # MAPI over HTTP URL MAPIUrl } 9 { # Configure Outlook Anywhere OutlookAnywhere } 10 { # PowerShell URL PowerShellUrl } 99 {# Exit } } } while ($opt -ne 99) } cls write-host " " write-host "Confirm Virtual directory settings? (1) Yes or (2) No? " -nonewline -foregroundcolor yellow $Answer = read-host if ($answer -eq "1") { if ($state -eq "2007") { get-WebServicesVirtualDirectory -server $global:srvname |ft *lurl* get-OWAVirtualDirectory -server $global:srvname |ft *lurl* get-ActiveSyncVirtualDirectory -server $global:srvname |ft *lurl* get-OabVirtualDirectory -server $global:srvname |ft *lurl* get-clientaccessserver $global:srvname |ft *luri* get-outlookanywhere -server $global:srvname |ft ExternalHostname,ClientAuthenticationMethod,IISAuthenticationMethods,SSLOffloading } if ($state -eq "NOMAPI") { get-WebServicesVirtualDirectory -server $global:srvname |ft *lurl* get-OWAVirtualDirectory -server $global:srvname |ft *lurl* get-ActiveSyncVirtualDirectory -server $global:srvname |ft *lurl* get-OabVirtualDirectory -server $global:srvname |ft *lurl* get-clientaccessserver $global:srvname |ft *uri* get-EcpVirtualDirectory -server $global:srvname |ft *lurl* get-PowerShellVirtualDirectory -server $global:srvname |ft *lurl* get-outlookanywhere -server $global:srvname |ft ExternalHostname, InternalHostname,ExternalClientAuthenticationMethod,InternalClientAuthenticationMethod,IISAuthenticationMethods,ExternalClientsRequireSsl,InternalClientsRequireSsl,SSLOffloading } if ($state -eq "MAPI") { get-WebServicesVirtualDirectory -server $global:srvname |ft *lurl* get-OWAVirtualDirectory -server $global:srvname |ft *lurl* get-ActiveSyncVirtualDirectory -server $global:srvname |ft *lurl* get-OabVirtualDirectory -server $global:srvname |ft *lurl* get-clientaccessserver $global:srvname |ft *uri* get-EcpVirtualDirectory -server $global:srvname |ft *lurl* get-MAPIVirtualDirectory -server $global:srvname |ft *lurl* get-PowerShellVirtualDirectory -server $global:srvname |ft *lurl* get-outlookanywhere -server $global:srvname |ft ExternalHostname, InternalHostname,ExternalClientAuthenticationMethod,InternalClientAuthenticationMethod,IISAuthenticationMethods,ExternalClientsRequireSsl,InternalClientsRequireSsl,SSLOffloading } }
Each set of code is different and purposely so because Exchange 2007 does not have certain features that 2010 does and 2013 has features that 2010 does not. The script will detect which version of Exchange is on the local server and use the appropriate menu to drive the configuration.
Operation
When the script is started it starts with the first step and an explanation of what is to be accomplished:
From this menu Internal and External URL options can be configured or the two URLs can be set the same:
Then another notice about the next step:
From this menu all URLs can be configured, or individual ones, as well as Outlook Anywhere as well as the AutoDiscover URI.
Once this step completes, you can choose to verify the settings or exit the script:
Other Menus
There are two other menus that appear if you use a different version of Exchange. The reason the above is for Exchange 2013 SP1+ is because this is when MAPI over HTTP was added to Exchange.
Exchange 2007
Exchange 2010
Download
Download HERE!
Just a quick question. Is powershell url really necessary?
No, its not required. It just makes it more uniform when connecting to an Exchange server. Also, if the FQDN is load-balanced, this will allow you to connect to PowerShell via the FQDN and also have a SSL connection match the certificate name on the server.