Ich habe ein Problem mit einem kaputten Exchange Server 2016 CU23 gehabt. Oder eher: Er ist nicht vollständig installiert gewesen. Es ist nur eine Testumgebung gewesen, aber ich habe gedacht, dass es nützlich oder interessant sein würde, bei diesem Problem tiefer einzusteigen.
Ich nehme euch bei meinen Troubleshooting-Schritten bzw. meinem Denkprozess mit.
Versuch, das Setup fortzusetzen
Zuerst habe ich versucht, das Setup fortzusetzen. Das Setup ist früh fehlgeschlagen – bei Step 1 of 13: Stopping Services.

Die Fehlermeldung im Detail:
| |
Okay, das Setup hat also versucht, ServiceControl.ps1 auszuführen. Wo dieses Skript gelegen hat … habe ich in dem Moment nicht gewusst, aber ich habe es später herausgefunden.
Exchange Server Setup Log prüfen
Zuerst haben wir das Exchange Server Setup Log unter C:\ExchangeSetupLogs\ExchangeSetup.log geprüft.
Im Log hat es mehr Kontext zum zuvor fehlgeschlagenen Befehl gegeben. Die Variable $RoleRoles ist also sicher nicht leer gewesen:
| |
Start-PreFileCopy[…].ps1 prüfen
Das Setup hat außerdem ein Skript erstellt, um diesen Befehl nachzustellen. Praktisch! Ich bin zur Datei unter C:\ExchangeSetupLogs\Start-PreFileCopy-20220622-0720250331374206211.ps1 navigiert.
| |
Ich habe eine Zeile auskommentieren müssen, die nur Klartext mit Datum/Uhrzeit gewesen ist (oberhalb von $roleList = [...]). Danach habe ich versucht, das Skript manuell auszuführen.
Und tatsächlich habe ich denselben Fehler wie zuvor im Setup erhalten, aber mit etwas mehr Details. Der Fehler ist in Zeile 302 von ServiceControl.ps1 aufgetreten. Und jetzt habe ich auch gewusst, wo ServiceControl.ps1 tatsächlich gelegen hat. Nice.
| |
ServiceControl.ps1 prüfen
ServiceControl.ps1 hat also im Exchange-Server-Bin-Verzeichnis gelegen. Das ist einfach gewesen. Also haben wir in das Skript geschaut. Zeile 301/302 sind:
| |
Das Umdrehen von $services ist also fehlgeschlagen. Die Fehlermeldung von vorher hat uns das Problem schon gesagt: Value cannot be null. Ist es wirklich null gewesen? Ich habe einen PowerShell-Debugging-Breakpoint mit der PowerShell ISE gesetzt, um es selbst zu sehen.
OKAY, es ist leer gewesen. Was habe ich hier überhaupt erwartet?
Danach habe ich mir die Definition der Funktion Get-ServiceToControl angesehen, die bei Zeile 105 gestartet ist.
| |
Diese Funktion hat die Variable $script:servicesToControl genutzt. Diese ist wiederum ab Zeile 56 definiert gewesen.
| |
Ah okay, das sind die tatsächlichen Windows-Service-Namen für jede Exchange-Server-Rolle gewesen. Das hat uns hier aber noch nicht direkt geholfen. Also einen Schritt zurück zu Get-ServiceToControl.
Oh ja, warte. Wenn $Active gesetzt ist, werden nur Windows-Services zurückgegeben, die nicht den Status Stopped haben. Wegen des fehlgeschlagenen Setups sind die meisten Exchange-Services Disabled gewesen, und sicher ist keiner gelaufen.
Also … kann es so einfach gewesen sein? Ich habe es mir so vorgestellt: Wenn wenigstens EIN Exchange-Service gelaufen wäre, hätte Get-ServiceToControl KEINE leere Antwort geliefert, also wäre [array]::Reverse($services) NICHT fehlgeschlagen. Dann hätte der Schritt „Stopping Exchange Services“ als erfolgreich gewertet werden sollen – richtig?
Einen Exchange-Service manuell starten
Also habe ich services.msc geöffnet, um den Dienst Microsoft Exchange Active Directory Topology (MSExchangeADTopology) zu aktivieren und zu starten.
Start-PreFileCopy[…].ps1 erneut ausführen
Ich habe versucht, Start-PreFileCopy-20220622-0720250331374206211.ps1 erneut auszuführen. Dieses Mal ist es mit einem anderen Fehler fehlgeschlagen. Das hat aber nach fehlenden Abhängigkeiten/Funktionen aus der Setup-Umgebung ausgesehen. Nichts allzu Kritisches.
| |
Exchange Server Setup erneut ausführen
Also könnte es jetzt innerhalb des Setup-Kontexts einfach funktionieren. Das habe ich versucht. Nach kurzer Zeit hat es schon gut ausgesehen, weil es jetzt bei Schritt 2 gewesen ist. Ich habe eine Pause gemacht.
Als ich zurückgekommen bin, ist kein Exchange Setup mehr gelaufen. Seltsam. Ist es abgestürzt? Ich habe die Datei C:\ExchangeSetupLogs\ExchangeSetup.log erneut geprüft. Sah jetzt gut aus:
| |
Verifizieren
Zuerst habe ich geprüft, ob die Services jetzt wie erwartet aktiviert gewesen sind und gelaufen sind. Hat gut ausgesehen.
Danach habe ich die Exchange Management Shell gestartet, um Get-ExchangeServer auszuführen. Hat ebenfalls gut ausgesehen.
Fazit
Es ist wirklich seltsam, wie dieser Check implementiert worden ist. IMO hätte Microsoft das Setup-Erlebnis hier verbessern können, wenn das Setup geprüft hätte, ob überhaupt Services gelaufen sind, die tatsächlich gestoppt werden mussten. Stattdessen ist es abgestürzt, wenn keine Exchange-Services gelaufen sind.
Im Nachhinein ist es immer leicht und offensichtlich gewesen. Aber vielleicht wäre ich schneller zum Ziel gekommen, wenn ich direkt diese Schlussfolgerung gezogen hätte:
- Das Setup ist beim Schritt „Stopping Services“ fehlgeschlagen
- Es sind keine Exchange-Services gelaufen
- = Also haben keine Services gestoppt werden können
Randbemerkung
Im Microsoft-Exchange-Kontext steht Cafe für “Client Access Front End”. Diese Abkürzung ist mir vorher irgendwie nicht bewusst gewesen.







