colinardo
Goto Top

Powershell: Konfigurieren der internen und externen URLs von Exchange Server 2013, 2016

back-to-topFür all diejenigen unter euch, die sich nicht durch alle Einstellungen für die internen und externen URLs im ECP wühlen möchten und da dort nicht alle nötigen URLs gesetzt werden können, habe ich ein Skript geschrieben, welches die internen und externen URLs für alle benötigten Dienste des Exchange Server 2013 / 2016 auf einen Schlag konfiguriert.
(EWS, OWA, ECP, OAB, Autodiscover, OutlookAnywhere, Mapi over HTTP)
<#
    .SYNOPSIS
    Setzt die internen und externen URLs für die Dienste von Exchange Server 2013/2016
    .DESCRIPTION
    Das Script konfiguriert die internen und externen URLs von Exchange Server 2013/2016 für folgende Dienste:
    - WebServicesVirtualDirectory
    - OutlookWebAccessDirectory
    - ECPVirtualDirectory
    - ActiveSyncVirtualDirectory
    - OABVirtualDirectory
    - AutoDiscover URL
    - Outlook Anywhere
    - MAPI over HTTP (EX 2016)
    .EXAMPLE
    & 'C:\path\set-exchange-urls.ps1' -ExchangeServer EXSRV2013.domain.local -InternalFQDN "mail.contoso.com" -ExternalFQDN "owa.contoso.com"  
    .PARAMETER ExchangeServer
    Der Name oder FQDN des Exchange-Servers auf dem die URLs geändert werden sollen (z.B. EXSRV2013 oder EXSRV2013.contoso.com)
    .PARAMETER InternalFQDN
    Der interne FQDN für den Zugriff innerhalb des Netzwerks (z.B. mail.contoso.com)
    .PARAMETER ExternalFQDN
    Der externe FQDN unter dem der Exchange von außen ereichbar sein soll (z.B. owa.contoso.com)
#>
[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$ExchangeServer,
    [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$InternalFQDN,
    [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$ExternalFQDN
)
begin{
    cls
    write-host "Stelle Verbindung zum Exchange-Server her ..." -F Green  
    $session = $null
    try{
       $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "http://$exchangeserver/powershell" -Authentication Kerberos -Credential (get-credential)  
        Import-PSSession $session -DisableNameChecking -AllowClobber | out-null
    }catch{
        write-host $_.Exception.Message -F Red
        return
    }
    $isExchange2016 = (Get-ExchangeServer $ExchangeServer).AdminDisplayVersion -match '^Version 15\.1'  
    Write-Host "Konfiguriere die URLs auf '$ExchangeServer' ..." -Foregroundcolor Green  
}
process{
    Write-Host "Setze EWS-URL ..." -F Green  
    Get-WebservicesVirtualDirectory -Server $ExchangeServer | Set-WebservicesVirtualDirectory -InternalURL https://$InternalFQDN/EWS/Exchange.asmx -ExternalURL https://$ExternalFQDN/EWS/Exchange.asmx
    Write-Host "Setze OWA-URL ..." -F Green  
    Get-OwaVirtualDirectory -Server $ExchangeServer | Set-OwaVirtualDirectory -InternalURL https://$InternalFQDN/owa -ExternalURL https://$ExternalFQDN/owa
    Write-Host "Setze ECP-URL ..." -F Green  
    Get-EcpVirtualDirectory -Server $ExchangeServer | Set-EcpVirtualDirectory -InternalURL https://$InternalFQDN/ecp -ExternalURL https://$ExternalFQDN/ecp
    Write-Host "Setze ActiveSync-URL ..." -F Green  
    Get-ActiveSyncVirtualDirectory -Server $ExchangeServer | Set-ActiveSyncVirtualDirectory -InternalURL https://$InternalFQDN/Microsoft-Server-ActiveSync -ExternalURL https://$ExternalFQDN/Microsoft-Server-ActiveSync
    Write-Host "Setze OAB-URL ..." -F Green  
    Get-OABVirtualDirectory -Server $ExchangeServer | Set-OABVirtualDirectory -InternalUrl https://$InternalFQDN/OAB -ExternalURL https://$ExternalFQDN/OAB
    Write-Host "Setze AutoDiscover-URL ..." -F Green  
    if ($isExchange2016){
        Set-ClientAccessService $ExchangeServer -AutodiscoverServiceInternalUri https://$InternalFQDN/Autodiscover/Autodiscover.xml
    }else{
        Set-ClientAccessServer $ExchangeServer -AutodiscoverServiceInternalUri https://$InternalFQDN/Autodiscover/Autodiscover.xml
    }
    Write-Host "Setze Outlook-Anywhere-Einstellungen ..." -F Green  
    Set-OutlookAnywhere -Identity "$ExchangeServer\Rpc (Default Web Site)" -InternalHostname $InternalFQDN -ExternalHostName $ExternalFQDN -InternalClientAuthenticationMethod ntlm -InternalClientsRequireSsl:$True -ExternalClientAuthenticationMethod NTLM -ExternalClientsRequireSsl:$True  
    
    if ($isExchange2016){
        Write-Host "Setze Mapi-over-HTTP-URL ..." -F Green  
        Get-MapiVirtualDirectory -Server $ExchangeServer | Set-MapiVirtualDirectory -InternalURL https://$InternalFQDN/mapi -ExternalURL https://$ExternalFQDN/mapi
    }
}
end{
    # Anzeigen der neu gesetzten URLs
    Write-Host "`n$('='*70)`nDie neuen URLs auf '$ExchangeServer' lauten nun wie folgt:`n$('='*70)`n" -F Green  
    Write-Host "EWS" -F Green  
    Get-WebservicesVirtualDirectory -Server $ExchangeServer | fl internalURL,ExternalURL
    Write-Host "OWA" -F Green  
    Get-OWAVirtualDirectory -Server $ExchangeServer | fl internalUrl,ExternalURL
    Write-Host "ECP" -F Green  
    Get-ECPVirtualDirectory -Server $ExchangeServer | fl InternalURL,ExternalURL
    Write-Host "ActiveSync" -F Green  
    Get-ActiveSyncVirtualDirectory -Server $ExchangeServer | fl InternalURL,ExternalURL
    Write-Host "OAB" -F Green  
    Get-OABVirtualDirectory -Server $ExchangeServer | fl InternalURL,ExternalURL
    Write-Host "Autodiscover URL" -F Green  
    if($isExchange2016){
        Get-ClientAccessService $ExchangeServer | fl AutodiscoverServiceInternalUri
    }else{
        Get-ClientAccessServer $ExchangeServer | fl AutodiscoverServiceInternalUri
    }
    Write-Host "Outlook Anywhere Einstellungen" -F Green  
    Get-OutlookAnywhere -Identity "$ExchangeServer\rpc (Default Web Site)" |fl internalhostname,internalclientauthenticationmethod,internalclientsrequiressl,externalhostname,externalclientauthenticationmethod,externalclientsrequiressl  
    if($isExchange2016){
        write-Host "MAPI over HTTP" -F Green  
        Get-MapiVirtualDirectory -Server $ExchangeServer | fl InternalURL,ExternalURL
    }

    Write-Host "`n$('='*70)`nAbschließende Aufräumarbeiten`n$('='*70)`n" -Foregroundcolor Green  
    Write-Host "Starte IIS-Dienste neu ..." -F Green  
    iisreset $ExchangeServer
    write-host "Beende Exchange-Session" -F Green  
    Remove-PSSession $session
    write-host "SKRIPT BEENDET" -F Green  
    write-host 'HINWEIS: Sollte eine der URL noch nicht greifen empfehle ich einen Neustart des Servers.' -F DarkYellow  
}
Das Skript wird dann bspw. so aufgerufen:
 &'C:\path\set-exchange-urls.ps1' -ExchangeServer EXSRV2013.domain.local -InternalFQDN "mail.contoso.com" -ExternalFQDN "owa.contoso.com"
Das Skript fragt dann nach den nötigen Credentials für die Ausführung der Konfiguration auf dem Exchange-Server verbindet sich dann mit dem Exchange und startet dann den Vorgang. Ein Ausführen in der Exchange-Management-Shell ist also nicht nötig.

back-to-topNACHTRAG vom 01.01.2016: Das Skript wurde nun zur Interoperabilität mit Exchange Server 2013 und jetzt auch 2016 optimiert.
Für Exchange Server 2016 ist noch eine URL mit hinzugekommen und zwar für die Nutzung von MAPI over HTTP.

Viel Spaß face-wink

Grüße @colinardo

Alle Angaben wie immer ohne Gewähr, und die Nutzung geschieht auf eigene Gefahr

Content-ID: 236083

Url: https://administrator.de/contentid/236083

Printed on: November 11, 2024 at 10:11 o'clock

Philipp.S
Philipp.S Mar 10, 2016 at 14:34:42 (UTC)
Goto Top
Hi Colinardo,

d.h ich kopiere mir den Kompletten Script Zl.01 - Zl.101 in eine ps1 Datei und speichere diese dann z.B. unter C:\script.ps1 ab.

Dann starte ich das ganze in der Powershell mit:

'C:\script.ps1' -ExchangeServer EXSRV2013.meinedomain.local -InternalFQDN "mail.meinedomain.com" -ExternalFQDN "owa.meinedomain.com"
?

ich nutze keinen Split DNS, kann ich dann auch für Extern den gleichen FQDN wie für Intern nehmen?

Viele Grüße
Philipp
colinardo
colinardo Mar 10, 2016 updated at 14:48:26 (UTC)
Goto Top
Hallo Philipp,
Zitat von @Philipp.S:
d.h ich kopiere mir den Kompletten Script Zl.01 - Zl.101 in eine ps1 Datei und speichere diese dann z.B. unter C:\script.ps1 ab.
ernst jetzt ?? Logisch, das ist der eigentliche Zweck eines Powershell-Skriptes face-wink.
Dann starte ich das ganze in der Powershell mit:
'C:\script.ps1' -ExchangeServer EXSRV2013.meinedomain.local -InternalFQDN "mail.meinedomain.com" -ExternalFQDN "owa.meinedomain.com"
?
Ja, aber DNS Namen solltest du schon deine Umgebung anpassen.
ich nutze keinen Split DNS, kann ich dann auch für Extern den gleichen FQDN wie für Intern nehmen?
Man kann natürlich auch für beide Seiten sie gleiche URL verwenden natürlich. Die externe sollte aber auch so lauten wie von extern tatsächlich darauf zugegriffen wird. D.h. auch das externe DNS sollte richtig konfiguriert sein.

Grüße Uwe
Philipp.S
Philipp.S Mar 10, 2016 at 15:07:31 (UTC)
Goto Top
Hallo Uwe,

ich habe mir jetzt den script unter C:\script.ps1 abgespeichert

und hab das ganze mit folgenden befehl im PS gestartet:
PS C:\Users\Administrator.MEINEDOMÄNE> cd c:\
PS C:\> 'script.ps1' -ExchangeServer srvex.meinedomäne.local -InternalFQDN "mail.meinedomäne.de" -ExternalFQDN "mail.meinedomäne.de

... darauf dieser Fehler
"
In Zeile:1 Zeichen:14

back-to-top'script.ps1' -ExchangeServer srvex.meinedomäne.local -InternalFQDN "mail.meinedomäne.de ...

back-to-top~~~~~~~~~~~~~~~

Unerwartetes Token "-ExchangeServer" in Ausdruck oder Anweisung.
In Zeile:1 Zeichen:30

back-to-top'script.ps1' -ExchangeServer srvex.meinedomäne.local -InternalFQDN "mail.meinedomäne.de ...

back-to-top~~~~~~~~~~~~~~~~~~~~

Unerwartetes Token "srv.meinedomäne.local" in Ausdruck oder Anweisung.
+ CategoryInfo : ParserError: (face-smile , ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

PS C:\>

Hast du mir eine Idee?
colinardo
colinardo Mar 10, 2016 updated at 15:19:34 (UTC)
Goto Top
meinedoäne.local
Wer nimmt denn schon eine Domäne mit einem Umlaut ? face-big-smile ä That's a bad idea
Philipp.S
Philipp.S Mar 10, 2016 at 15:19:28 (UTC)
Goto Top
das ist doch nicht mein richtiger domänenname.....
colinardo
colinardo Mar 10, 2016 updated at 15:26:23 (UTC)
Goto Top
Die Fehlermeldung verweist aber direkt auf den Namen!!

Bitte in einer Powershell aufrufen nicht in einer Batchumgebung.

Skript wurde ausgiebig getestet und funktioniert einwandfrei.
Philipp.S
Philipp.S Mar 10, 2016 at 15:35:33 (UTC)
Goto Top
Ich verstehe nicht was ich falschmache ....


ich habe deinen Script genommen und die Zl.1-Zl.101unter c:\script.ps1 gespeichert

nun öffne ich die Powershell und gebe den Befehl:
'C:\script.ps1' -ExchangeServer srvexch.meinedomäne.local -InternalFQDN "mail.meinedomäne.de" -ExternalFQDN "mail.meinedomäne.de"

Was mache ich falsch?
Philipp.S
Philipp.S Mar 10, 2016 at 16:02:01 (UTC)
Goto Top
soo wenn ich die ' ' bei C:\script.ps1 weglasse erscheint nun folgendender Fehler:


[PS] C:\>C:\script.ps1 -ExchangeServer srvex.domain.local -InternalFQDN "mail.domain.de" -ExternalFQDN "mail.domain.de"
In C:\script.ps1:97 Zeichen:4

back-to-top25.

back-to-top~

Schließende ")" fehlt in einem Ausdruck.
In C:\script.ps1:99 Zeichen:57

back-to-top[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$ExchangeServe ...

back-to-top~

Nach "(" wurde ein Ausdruck erwartet.
In C:\script.ps1:111 Zeichen:1

back-to-top)

back-to-top~

Unerwartetes Token ")" in Ausdruck oder Anweisung.
In C:\script.ps1:91 Zeichen:1

back-to-top[CmdletBinding()]

back-to-top~~~~~~~~~~~~~~~~~

Unerwartetes Attribut "CmdletBinding".
+ CategoryInfo : ParserError: (face-smile , ParseException
+ FullyQualifiedErrorId : MissingEndParenthesisInExpression

[PS] C:\>
colinardo
colinardo Mar 10, 2016 updated at 16:41:29 (UTC)
Goto Top
Erstens hast du das & vor dem Pfad vergessen wenn man Anführungszeichen benutzt und zweitens hast du den Code nicht über den Button "Quelltext" oben rechts kopiert wer macht denn sowas ???. *Hände über dem Kopf zusammenschlag* face-sad
Mach doch bitte erst mal einen Grundkurs Powershell bevor du hier in so einen Thread solche Peinlichkeiten postest. Danke!
Gesualdo
Gesualdo May 17, 2016 updated at 11:05:11 (UTC)
Goto Top
Vielleicht bin ich noch dümmer...

Aber mir bringt das Skript immer den Fehler "Es wurde kein Parameter gefunden, der dem Parameternamen "Message" entspricht."!
Bin ich zu dumm, oder ist da vielleicht wirklich ein Fehler?

DANKE
colinardo
colinardo May 17, 2016 updated at 11:14:30 (UTC)
Goto Top
Hallo Gesualdo,
Zitat von @Gesualdo:
Aber mir bringt das Skript immer den Fehler "Es wurde kein Parameter gefunden, der dem Parameternamen "Message" entspricht."!
Bin ich zu dumm, oder ist da vielleicht wirklich ein Fehler?
Wenn du noch die alte Powershell 2.0 benutzt kein Wunder face-wink Dort gab es den Parameter -Message von Get-Credential noch nicht.
Du kannst den aber problemlos in Zeile 34 weglassen
$session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "http://$exchangeserver/powershell" -Authentication Kerberos -Credential (get-credential) 
Ich nehme die Beschreibung mal oben auf dem Skript raus, ist sowieso nur von "beschreibender" und nicht "funktioneller" Natur.

Ich rate aber trotzdem zu einem Update der PS bzw. des Management Frameworks. Je nach Server OS bitte die Hinweise von MS zu dem supporteten PS-Versionen beachten.

Grüße Uwe
Gesualdo
Gesualdo May 17, 2016 at 11:44:43 (UTC)
Goto Top
Jetzt läuft alles durch, er bringt mir nur am Ende den Fehler, das das Obeket "ExchangeServer"\rpc (Default Web Site" nicht auf "ExchangeServer" gefunden wurde ...
Was soll das denn?
colinardo
colinardo May 17, 2016 updated at 11:48:48 (UTC)
Goto Top
Dann führst du das ganze nicht für einen EX2013/2016 aus oder deine Default-Website wurde umbenannt oder du machst das ganze auf einem Exchange ohne CAS Rolle.
Gesualdo
Gesualdo May 17, 2016 at 11:51:02 (UTC)
Goto Top
sry ja, mach das ganze auf 2010!
colinardo
colinardo May 17, 2016 updated at 11:53:40 (UTC)
Goto Top
Zitat von @Gesualdo:
sry ja, mach das ganze auf 2010!
X) Wenn man lesen kann ist man im Vorteil face-smile Das Skript gilt wie im Titel geschrieben nur für 2013/2016!
Gesualdo
Gesualdo May 17, 2016 at 11:58:19 (UTC)
Goto Top
Gibt es was adäquates für 2010?
colinardo
colinardo May 17, 2016 updated at 12:40:06 (UTC)
Goto Top
Zitat von @Gesualdo:
Gibt es was adäquates für 2010?
Die nötigen Befehle stecken alle oben im Skript die lassen sich bis auf ein paar Anpassungen auch manuell im Exchange 2010 anwenden. Habe nur gerade keine Zeit zur Anpassung dafür.
Die wichtigsten davon kannst du auch einfach manuell ausführen.
Gesualdo
Gesualdo May 17, 2016 at 12:54:03 (UTC)
Goto Top
Ich habe nur das Problem, daß ich zwei Server (einen nromalen (mit DNS, DHCP, File und Print) und einen zweiten nur mit Exchange) habe! Bei einem Server ist das ja alles kein Problem, nur bei Servern stelle ich mich einfach zu blöd an...) - deshalb die Frage nach der Hilfe...!!)
colinardo
colinardo May 17, 2016 updated at 13:11:40 (UTC)
Goto Top
Zitat von @Gesualdo:
nur bei Servern stelle ich mich einfach zu blöd an...)
Und dann an einem Server mit einem Exchange rumfrickeln, das kann definitiv nichts geben.
Versuche, einen Exchange nur mit zusammengesuchten Skripten im Web am Laufen zu halten halte ich für sehr sehr sportlich. Mach es richtig und erarbeite dir Schritt für Schritt das nötige Wissen um einen Exchange zu administrieren. Nur damit wirst du Erfolg haben. Ein Exchange administriert sich nicht mal eben nebenbei, dazu ist es ein zu komplexes Stück Software.
Die Doku und best Practices im Technet sind deine erste Anlaufstelle. Denn auf das Grundwissen bauen alle Elemente auf und nur wenn man diese versteht weiß man wie man welche Dienste mit welchen Werten zu konfigurieren hat.

Sorry, aber mit dem Satz "ich bin zu blöd dafür" machst du es dir nur sehr einfach. Lesen und Lernen kann jeder der eine Schule besucht hat, man muss nur mal anfangen, ohne Fleiß gibt's eben keinen Preis, das gilt hier so wie bei fast allen Dingen!
Gesualdo
Gesualdo May 17, 2016 at 13:11:20 (UTC)
Goto Top
Welche Seiten empfiehlst Du Dann konkret?
colinardo
colinardo May 17, 2016 updated at 13:15:38 (UTC)
Goto Top
Zitat von @Gesualdo:

Welche Seiten empfiehlst Du Dann konkret?
Das Technet bei MS liefert dir alle nötigen Grundlagen zum Exchange, so wie http://www.msxfaq.com ist eine gute Anlaufstelle.

Wenn du noch mehr Fragen hast, bitte per PM, dann müllen wir den Thread hier nicht unnötig zu, Danke.
Das hat ja nun nichts mehr mit dem Thread zu tun!
lordofremixes
lordofremixes Jul 06, 2017 at 14:21:28 (UTC)
Goto Top
Coole Sache!!