Exchange DAG: Server in Wartungsmodus (Maintenance) setzen per Powershell
Problem:
Aktuell musste ich viele Server in einem DAG patchen (CU22, SU etc.) und ich wollte das ganze sauber skripten um Zeit zu sparen und das ganze auch zu standardisieren.
Lösung:
Hier mein Skript, das ich geschrieben habe um den Server sauber in den Wartungsmodus zu setzen. Hier habe ich auch berücksichtigt, dass ich eventuell Mails in den Mail-Queues auf einen anderen Server verschiebe. Das Skript wartet auch, bis alle Datenbanken unmounted sind. Am Ende wird auch nochmal überprüft, ob sich der Server wirklich im Wartungsmodus befindet (Database- und ClusterNode-Checkup)
WICHTIG: Beim "Redirect-Message" MUSS der Target-Server als FQDN angegeben werden und darf selbst nicht in Wartung sein!
Aktuell musste ich viele Server in einem DAG patchen (CU22, SU etc.) und ich wollte das ganze sauber skripten um Zeit zu sparen und das ganze auch zu standardisieren.
Lösung:
Hier mein Skript, das ich geschrieben habe um den Server sauber in den Wartungsmodus zu setzen. Hier habe ich auch berücksichtigt, dass ich eventuell Mails in den Mail-Queues auf einen anderen Server verschiebe. Das Skript wartet auch, bis alle Datenbanken unmounted sind. Am Ende wird auch nochmal überprüft, ob sich der Server wirklich im Wartungsmodus befindet (Database- und ClusterNode-Checkup)
WICHTIG: Beim "Redirect-Message" MUSS der Target-Server als FQDN angegeben werden und darf selbst nicht in Wartung sein!
# Exchange Module laden Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn # Prüfen ob bereits im Wartungsmodus (ClusterNode not UP und keine Datenbank aktiv gemountet) if ((Get-ClusterNode -Name $env:Computername).state -ne "Up" -and (Get-MailboxDatabaseCopyStatus -Server $env:ComputerName | Where {$_.Status -eq "Mounted"}).Count -eq 0) { Write-Host "Server $env:ComputerName befindet sich bereits im WARTUNGSMODUS" -ForegroundColor Green Write-Host "Keine Änderung vorgenommen..." -ForegroundColor Green Exit } # Sicherheitsfunktionen abschalten (PS-Execution-Policy und Defender) Write-Host "Server $env:ComputerName wir in den Wartungsmodus versetzt..." Write-Host "PS-Policy und Defender werden deaktiviert" Set-ExecutionPolicy Unrestricted -force Set-MpPreference -DisableRealtimeMonitoring $true Sleep -Seconds 3 Write-Host "PS-Policy unrestriced und Defender deaktiviert" # Hub-Transport abschalten # Es werden keine Mails mehr angenommen Write-Host "Hub-Transport wird deaktiviert und Mail-Queues verschoben..." Set-ServerComponentState $env:ComputerName –Component HubTransport –State Draining –Requester Maintenance Sleep -Seconds 5 # Bestehende Mails werden aus der Queue auf einen anderen Server verschoben Redirect-Message -Server $env:ComputerName -Target-Confirm:$false Write-Host "Hub-Transport deaktiviert" # ClusterNode in Suspend-Mode Write-Host "ClusterNode $env:ComputerName wird angehalten" Suspend-ClusterNode –Name $env:ComputerName Sleep -Seconds 3 Write-Host "ClusterNode $env:ComputerName angehalten" # Mailbox-Datenbanken verschieben und Write-Host "Aktive Mailboxdatenbanken werden evakuiert" Set-MailboxServer $env:ComputerName –DatabaseCopyActivationDisabledAndMoveNow $true Set-MailboxServer $env:ComputerName –DatabaseCopyAutoActivationPolicy Blocked Write-Host "Skript wartet, bis Datenbanken evakuiert wurden - Prüfintervall: 30 Sekunden" While ((Get-MailboxDatabaseCopyStatus -Server $env:ComputerName | Where {$_.Status -eq "Mounted"}).Count -ne 0) { Sleep -Seconds 30 } Write-Host "Datenbanken wurden alle evakuiert - keine aktive Datenbankkopie mehr auf $env:ComputerName aktiv" # Server-Komponenten deaktivieren Set-ServerComponentState $env:ComputerName –Component ServerWideOffline –State InActive –Requester Maintenance Write-Host "Alle Server-Komponenten deaktiviert" # Prüfen ob im Wartungsmodus (keine aktiven Datenbanken und ClusterNode not UP) if ((Get-ClusterNode -Name $env:Computername).state -ne "Up" -and (Get-MailboxDatabaseCopyStatus -Server $env:ComputerName | Where {$_.Status -eq "Mounted"}).Count -eq 0) { Write-Host "Server $env:ComputerName befindet sich im WARTUNGSMODUS" -ForegroundColor Green } Else { Write-Host "Server $env:ComputerName befindet sich NICHT im WARTUNGSMODUS" -ForegroundColor Red Write-Host "Bitte prüfen Sie die Dienste und Befehle auf Meldungen" -ForegroundColor Red }