Januar 22, 2026

Best practices für die Inbetriebnahme (zusätzlicher) Exchange Server

Vorbereitung

Bevor die eigentliche Installation beginnen kann, müssen ein paar Komponenten installiert werden – ich mache das immer manuell. Hier die Kurzfassung:

  • Um das IIS Rewrite Module installieren zu können, muss schon IIS installiert sein, also am besten mit den Windows Features anfangen:
Install-WindowsFeature Server-Media-Foundation, NET-Framework-45-Core, NET-Framework-45-ASPNET, NET-WCF-HTTP-Activation45, NET-WCF-Pipe-Activation45, NET-WCF-TCP-Activation45, NET-WCF-TCP-PortSharing45, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation, RSAT-ADDS

Nun kann die eigentliche Installation beginnen, entweder per UI oder per unattended Setup. Beim ersten neuen Server sind normalerweise Schema-Update und Domain-Prep Pflicht, für Details siehe z.B. hier: Prepare Active Directory and domains for Exchange Server – ALI TAJRAN.

Eine Minimal-Variante sieht z.B. so aus:

E:\Setup.exe /IAcceptExchangeServerLicenseTerms_DiagnosticDataOFF /PrepareSchema

Gefolgt von:

E:\Setup.exe /IAcceptExchangeServerLicenseTerms_DiagnosticDataOFF /PrepareAD

Ein Check der Ergebnisse gehört zum guten Ton: Check Exchange Schema version with PowerShell – ALI TAJRAN

Kurfassung: Exchange SE RTM hat dasselbe Schema wie Exchange 2019 CU15

Exchange SE RTM

  • rangeUpper: 17003
  • objectVersion (Default): 13243
  • objectVersion (Configuration): 16763

Und so kann man es prüfen:

"RangeUpper: " + (Get-ADObject ("CN=ms-Exch-Schema-Version-Pt," + (Get-ADRootDSE).SchemaNamingContext) -Properties rangeUpper).rangeUpper
"ObjectVersion (Default): " + (Get-ADObject ("CN=Microsoft Exchange System Objects," + (Get-ADRootDSE).DefaultNamingContext) -Properties objectVersion).objectVersion
"ObjectVersion (Configuration): " + (Get-ADObject -LDAPFilter "(objectClass=msExchOrganizationContainer)" -SearchBase (Get-ADRootDSE).ConfigurationNamingContext -Properties objectVersion).objectVersion

Vielleicht ist also gar kein Schema Update erforderlich.

Normale vs. „sanfte“ Installation

Nach der Installation eines neuen zusätzlichen Servers wird dieser von den Clients normalerweise früher oder später erkannt und auch verwendet. Kümmert man sich nicht rechtzeitig um Zertifikate, URLs für vDirs und die AutoDiscoverServiceInternalUri, dann beschweren sich die Clients zurecht über den nicht fertigen Server. Nun gibt es mehrere Möglichkeiten, um nicht in Hektik verfallen zu müssen:

  • Server außerhalb der Geschäftszeiten installieren und in Betrieb nehmen. Wenn kein Client aktiv ist, kann sich auch niemand beschweren.
  • Dafür sorgen, dass Clients den neuen Server nicht kontaktieren

Dummerweise ist letzteres gar nicht so einfach. Exchange erstellt beim Setup einen SCP und trägt standardmäßig als Ziel https://servername/Autodiscover/Autodiscover.xml ein. Diesen Wert muss man nach dem Setup so bald wie möglich „neutralisieren“ – also auf $null setzen.

Set-ClientAccessService -Identity $env:COMPUTERNAME -AutoDiscoverServiceInternalUri $null

So ist für die Clients erst einmal Zeit gewonnen. Trotzdem ist es empfehlenswert, zusätzlich den Server in den Wartungsmodus zu versetzen.

Set-ServerComponentState -Identity $env:COMPUTERNAME -Component ServerWideOffline -State Inactive -Requester Maintenance

Nachteil hierbei: Da die beiden Befehle am besten direkt nach Installationsende abgefeuert werden sollten, muss man sich auf die Lauer legen. So ein Exchange Setup dauert je nach Umgebung 30 Minuten oder mehr und da will man in der Regel nicht daneben stehen und zuschauen.

Lösung: Die Schritte automatisieren. Hier ein Beispiel-Skript dazu:

function Write-Log {
    param (
        [string]$message,
        [string]$logFilePath=$logfile
    )
    Add-Content -Path $logFilePath -Value "$(Get-Date): $message" -Force
    Write-Output $message
}

$logFile = "C:\ExchangeSetupLogs\_SetupHelper.log"

# 1. Start Exchange setup 

$setupArgs = @(
  '/Mode:Install',
  '/Roles:Mailbox',
  '/TargetDir:"D:\Exchange"',  # Install path
  '/InstallWindowsComponents',  # (optional) install Windows roles/features automatically
  '/IAcceptExchangeServerLicenseTerms_DiagnosticDataOFF'
) -join ' '

Write-Log "Starting setup"
Start-Process -FilePath "E:\setup.exe" -Wait -ArgumentList $setupArgs 
Write-Log "Setup finished"

# 2. As soon as setup.exe is finished: set SCP to $null
Write-Log "Adding Exchange SnapIn"
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
Write-Log "Setting SCP for [$env:COMPUTERNAME] to NULL"
Set-ClientAccessService -Identity $env:COMPUTERNAME -AutoDiscoverServiceInternalUri $null

# 3. Put server into manintenance mode
write-Log "Enabling Exchange maintenance mode"
Set-ServerComponentState $env:COMPUTERNAME -Component ServerWideOffline -State Inactive -Requester Maintenance

# 4. (Optional) IIS stop or block 443 temporarily 
# Stop-Service W3SVC -Force

Write-Log "Finished."

Nun kann man ganz in Ruhe die Voraussetzungen schaffen, um die Server in Betrieb zu nehmen, also z.B.

  • Zertifikat importieren, für IIS, SMTP und ggf. IMAP und POP3 aktivieren – nutzt Import-ExchangeCertificate, siehe auch hier
  • URLs für vDirs setzen, AutoDiscoverServiceInternalUri setzen – hier hilft ggf. mein Skript
  • DNS A record für den neuen Server zum „shared name“ hinzufügen (-> internal/externalUrl)

Frühestens jetzt kann man den Wartungsmodus für den Server aufheben.

Set-ServerComponentState -Identity $env:COMPUTERNAME -Component ServerWideOffline -State Active -Requester Maintenance

OK, ich gebe zu: Nicht die Installation selbst war sanft, sondern die nachgelagerten Schritte machten das Gesamtpaket sanft. Insofern war die Überschrift ein kleines bisschen irreführend. Aber egal…

Dann kann es weitergehen, hier eine vermutlich unvollständige Liste:

  • Sicherstellen, dass alle Receive Connectors vorhanden sind – auch hierfür gibt’s ein Helferlein
  • Scope der Send Connectors erweitern um den neuen Server. Sicherstellen, dass ein etwaiger Smart host auch Mails vom neuen Server entgegennimmt. Möglicherweise muss man dazu den Server auf dem Smart host „bekannt“ machen
  • Bei Hybridumgebungen den Hybrid Wizard ausführen und den neuen Server bei den Connectors hinzufügen
  • Etwaiges Publishing und/oder Firewall-Regeln erweitern
  • IMAP / POP3 aktivieren (wenn es denn unbedingt sein muss, besser aber alte Zöpfe abschneiden :))
  • Standard DB leeren und löschen, neue DBs gemäß Konvention anlegen, ggf. neue DAG erstellen, second copy einrichten…
  • Wenn der neue Server einen alten ersetzen soll: Mailboxen migrieren
  • Backup umstellen/anpassen
  • Ggf. IP Adresse „recyclen“

Sonstiges

  • Ich erstelle gerne von Zeit zu Zeit eine kleine Doku mit dem folgenden Script. Hemdsärmelig, aber es tut, was es soll. Insbesondere in den Teil mit den Mailbox Folder permissions ist eine Menge Hirnschmalz geflossen. Wenn ihr die braucht (Achtung: sehr zeitaufwändig), könnt ihr den Parameter –includeMailboxFolderPermissions setzen.
  • Ich liebe Grid views. Auch zum Anschauen von CSV files ohne Excel. Geht ganz bequem hiermit:
  • Das Registrieren als „Öffnen mit“ Aktion geht ganz einfach z.B. so:
# Customize path to script:
$script = 'C:\Tools\scripts\OpenCsvWithOgV.ps1'

$baseKey = 'HKCU:\Software\Classes\SystemFileAssociations\.csv\shell\OpenWithOGV_Clipboard'
$cmdKey  = Join-Path $baseKey 'command'

New-Item -Path $baseKey -Force | Out-Null
Set-ItemProperty -Path $baseKey -Name 'MUIVerb' -Value 'Open with Out-GridView (Selection → Clipboard)'
Set-ItemProperty -Path $baseKey -Name 'Icon' -Value 'powershell.exe'

New-Item -Path $cmdKey -Force | Out-Null
$command = 'powershell.exe -NoProfile -ExecutionPolicy Bypass -STA -File "' + $script + '" "%1" -ToClipboard'
# Set default value of the "command" key:
Set-Item -Path $cmdKey -Value $command

Und schon kann man das Ganze bequem per (Shift->)Rechtsklick nutzen.

  • Im deutschsprachigen Umfeld kommt man in Sachen Exchange an MSXFAQ und FrankysWeb kaum vorbei, die beiden begleiten mich seit Ewigkeiten. Franky hat viele coole Tools gebaut, z.B. Exchange Reporter für eine tägliche Status-Email zum Zustand der Umgebung, Exchange Message Tracking GUI und Exchange Monitor als niedrigschwellige Monitoring-Lösung

Viel Erfolg beim Upgrade! 🙂

PS: Ich werde hier von Zeit zu Zeit neues hinzufügen, stay tuned.

0 0 Bewertungen
Article Rating
Abonnieren
Benachrichtigen bei
guest
0 Comments
Inline-Feedbacks
Alle Kommentare anzeigen
0
Deine Meinung würde uns sehr interessieren. Bitte kommentiere.x