Exchange Server speichern einen Großteil der Konfiguration im Active Directory, daher beinhaltet die eine Sicherung der Exchange Server nicht die Konfiguration der Exchange Server, sondern in der Regel nur die Daten (wie beispielsweise die Postfächer). Wichtige Einstellungen wie beispielsweise Berechtigungen auf Postfächern oder Einstellungen zu den Virtuellen Verzeichnissen, werden im Active Directory gespeichert. Gerade wenn es mehrere oder viele Exchange Administratoren gibt, kann es sinnvoll sein ein Backup der Konfiguration der jeweiligen Exchange Server zu haben.
Ein Backup lässt sich relativ einfach erstellen, dazu habe ich bereits ein kleines Script vorbereitet. Leider habe ich aber bisher keinen gangbaren Weg gefunden, wie sich so ein Backup der Konfiguration wieder zurückspielen lässt.
Allerdings kann man mit einem zweiten Script das Backup mit der aktuellen Konfiguration vergleichen und somit gezielt einzelne Einstellung wieder auf den Stand des Backups zurück stellen (manuell mit den entsprechenden CMDLets). Dies kann insbesondere bei Konfigurationsänderungen, welche sich im Nachhinein als fehlerhaft erweisen, ganz nützlich sein.
Hier mal ein bisschen was zum Hintergrund, wie mittels PowerShell Backups von Einstellungen angelegt werden können. Solche Backups lassen sich natürlich nicht nur für Exchange Konfigurationen anfertigen, sondern für nahezu allen, was sich irgendwie per PowerShell verwalten lässt. Mittels des PowerShell CMDLets “export-Clixml” lässt sich die Ausgabe (bzw. die Objekte) eines Befehls in einer XML Datei speichern.
Hier mal ein Beispiel um die Konfiguration der “Akzeptierten Domains” einen Exchange Servers in einer XML-Datei zu speichern. Das CMDLet “Get-AcceptedDomain” liefert die Einstellungen der akzeptierten Domains einen Exchange Servers, das CMDlet “Excport-Clixml” speichert das Objekt mit allen Werten nun in einer XML Datei:
1
|
Get-AcceptedDomain | Export-Clixml c:\temp\accepteddomains.xml |
Die Datei “accepteddomains.xml” enthält nun die Objekte welche von “Get-AcceptedDomain” geliefert wurden (hier einmal das “gekürzte XML):
Um sich nun das gespeicherte XML wieder anzuzeigen, kann der folgende Befehl verwendet werden:
1
|
Import-Clixml C:\temp\accepteddomains.xml |
Hier sieht man nun alle akzeptierten Domains und deren Einstellungen. Das XML enthält übrigens alle Einstellungen, die Ausgabe oben wird nur in einfacher Form dargestellt. Will man sich alle Einstellungen anzeigen lasen, ist dies beispielsweise mit dem folgenden Befehl möglich:
1
|
Import-Clixml C:\temp\accepteddomains.xml | select * |
Der Import lässt sich auch in einer Variable speichern und dann weiter verarbeiten, beispielsweise so:
1
|
$domains = Import-Clixml C:\temp\accepteddomains.xml |
Die Variable $domains enthält nun alle Daten aus der Datei “accepteddomains.xml”. Auf diese Daten kann man nun zugreifen und diese nun nach belieben verwenden:
Das CMDlet “Export-Clixml” eignet sich also ziemlich gut, um Einstellungen aus der PowerShell zu speichern. Leider eignet sich “Import-Clixml” aber nicht um die gespeicherten Daten auch wieder in eine Exchange Konfiguration zu importieren.
Der Hintergrund ist in diesem Fall folgender:
Die Einstellungen wurden mittels der CMDLets “get-accepteddomain” und “export-clixml” gespeichert. Um die gespeicherten Daten nun wieder zu importieren und die Exchange Konfiguration anhand der importierten Daten anzupassen, wären die CMDLets “Import-Clixml” und je nach Situation bestimmte Exchange CMDlets nötig.
Als Beispiel: Wie in den Screenshots zu sehen ist, gibt es eine Domain “dummy.de” in den XML Datei. Wenn in der aktuellen Exchange Konfiguration nun die Domain “dummy.de” gelöscht wurde, müsste sie mittels den CMDlets “new-accepteddomain” angelegt werden. Falls die Domain “dummy.de” nur verändert wurde, aber noch vorhanden ist, müsste die Domain mittels des CMDlets “set-accepteddomain” bearbeitet werden.
Hier ergibt sich nun das Problem, dass “get-accepteddomain”, welches zum Speichern der Einstellungen verwendet wurde, zwar alle Einstellungen liefert, aber “set-accepteddomain” oder “new-accepteddomain” nur mit ganz bestimmten Einstellungen aufgerufen werden können. Mit den vielen Einstellungen die “get-accepteddomain” liefert, können die CMDLets “new-accpteddomain” und “set-accepteddomain” nichts anfangen.
Um bei diesem Beispiel zu bleiben, habe ich die Domain “dummy.de” aus der Exchange Konfiguration gelöscht, die Variable $domains enthält nach wie vor die Daten aus der “Sicherung” bzw der XML-Datei:
Der Versuch die Domain “dummy.de” nun wieder aus dem “Backup ($domains)” anzulegen geht also in die Hose:
Wie bereits eingangs erwähnt, habe ich hier keinen gangbaren Weg gefunden, damit eine mittels “Export-Clixml” gesicherte Konfiguration auch wiederhergestellt werden kann. Hier muss man also manuell ran.
Allerdings ist es meistens auch gar nicht nötig, die Konfiguration aus dem Backup automatisch wiederherstellen zu können. Wie bereits erwähnt geht es hier ja nicht um die Daten, sondern um die Konfiguration. Wenn also eine Konfigurationsänderung zu einem unerwünschten Verhalten geführt hat, dann reicht es ja meistens schon aus, die derzeitige Konfiguration mit dem Stand aus dem Backup zu vergleichen und dann gezielt bestimmte Änderungen wieder rückgängig zu machen, oder entsprechend anzupassen. Wenn beispielsweise eine Domain (wie dummy.de) gelöscht wurde und zugleich auch eine weitere Domain “valid.de” zur Konfiguration hinzugefügt wurde, will man ja nicht “valid.de” löschen, nur damit “dummy.de” wieder Mails erhalten. Hier müsste also eine fachliche Prüfung erfolgen, welche Konfigurationsänderung dazu geführt hat, das “Dummy.de”-Benutzer keine Mails mehr erhalten.
Genau für diesen Fall sind nun die beiden folgenden Scripte gedacht. Das Script “ExchangeConfigBackup.ps1” erstellt mittels “Export-Clixml” eine Sicherung der wichtigsten Exchange Einstellungen. Das zweite Script “CompareExchangeConfigChanges.ps1” vergleicht den Stand aus der Sicherung mit der aktuellen Exchange Konfiguration und listet die Änderungen auf.
Die beiden Scripte können hier runtergeladen werden und können leicht den eigenen Anforderungen angepasst werden:
Die ersten Zeilen im Script “ExchangeConfigBackup.ps1” müssen an die eigene Umgebung angepassst werden:
In Zeile 1 muss ein Pfad zu einem Order angelegt werden in dem das Backup gespeichert wird, dies kann auch ein Share sein, auf dem der Benutzer welcher das Script ausführt Zugriff hat. In Zeile 2 wird wird Passwort für die Zertifikate angegeben, Das Backup beinhaltet auch die SSL Zertifikate (nur zur Sicherheit). Wenn das Backup per Mail verschickt werden soll, müssen die Zeilen 3-5 entsprechend angepasst werden.
Das Script kann nun per geplanten Task ausgeführt werden:
Das Sript erstellt dann das Backup in dem gewählten Ordner, dies sieht beispielsweise so aus:
Bei Bedarf wird auch eine Mail im dem Backup als ZIP-Arcchiv verschickt:
Das zweite Script “CompareExchangeConfigChanges” vergleicht nun einen Stand aus dem Backup mit der aktuellen Exchange Konfiguration. Hier muss zunächst innerhalb des Scripts in der ersten Zeile der Pfad zum Backup Verzeichnis eingetragen werden:
Das Backup muss in diesem Ordner in entpackter Form vorliegen, das ZIP aus der Mail muss also in den Ordner extrahiert werden.
Sobald ein Backup zum Vergleich im Ordner abgelegt wurde, kann die aktuelle Exchange Konfiguration mit der gespeicherten Konfiguration mittels “CompareExchangeConfigChanges” verglichen werden. Ich habe dies hier Testweise einmal nachgestellt.
Ich habe zunächst ein Backup der Konfiguration erstellt und dann die Domain “dummy.de” gelöscht. Nachdem die Domain gelöscht wurde, habe ich die aktuelle Konfiguration mit der gespeicherten Konfiguration im Backup verglichen:. Das Ergebnis sieht dann wie folgt aus:
Es wurde eine Änderung der Konfiguration in der Datei “AcceptedDomains” festgestellt, im Backup ist hier noch die Domain “dummy.de” vorhanden (BackupValue). In der derzeitigen Exchange Konfiguration ist die Domain nicht mehr vorhanden (CurrentValue).
Ganz zuverlässig sind die beiden Scripte allerdings nicht, denn es ändern sich ja auch mal gewisse Werte im ganzen normalen Betrieb (Beispielsweise TimeStamps oder Handels). Es ist also etwas Übung nötig, damit man im Fehlerfall eine mögliche Ursache aus einer Konfigurationsänderung ablesen kann. Ich denke aber dass diese beiden Scripte etwas helfen können, wenn beispielsweise geplante Änderungen anstehen und man vorher noch einmal ein “kleines Backup” der alten Konfiguration für den Fall der Fälle haben möchte.
Da die beiden Scripte recht schlank sind, lassen sie sich auch einfach an die eigenen Wünsche anpassen.
Nachtrag
Ich habe in den Beispielen eine “akzeptierte Domain” verwendet. Die akzeptierten Domains werden wie die meisten Exchange Einstellungen im Active Directory gespeichert. Im Falle der akzeptierten Domains hier:
Falls also aus “Versehen” eine akzeptierte Domain gelöscht wurde, kann diese nicht wiederhergestellt werden, indem der Exchange Server aus einem Backup wiederhergestellt wird. In diesem Fall müsste der Domain Controller wiederhergestellt werden… Oder man legt einfach die entsprechende Exchange Konfiguration wieder an und spart sich die Wiederherstellung…