Der Zustand einzelner Exchange Protokolle lässt sich bequem über eine URL ermitteln, dies ist insbesondere für Loadbalancer interessant, da auf einfache Weise festgestellt werden kann, ob das Protokoll auf dem jeweiligen Server verfügbar ist. Die Abfrage der jeweiligen URLs ist aussagekräftiger als eine einfache Prüfung ob der Port am Exchange Server noch geöffnet ist, aber nicht so lastintensiv wie eine Anmeldung an einem Postfach.
Über die Exchange HealthCheck URLs können Loadbalancer somit feststellen, ob weiterhin Verbindungen an den Server geschickt werden sollen oder ob der Server aus dem Pool genommen wird.
Die HealthCheck Seiten selbst bieten nur wenige Informationen:
“200 OK” kann als Anhaltspunkt für den Loadbalancer genommen werden, um weiterhin Verbindungen an den Server zu senden. Bei anderen Statuscodes sollte der Loadbalancer den Server aus dem Pool nehmen. Aufwendige Tests von Loadbalancern mit Anmeldung an ein Postfach usw. können somit entfallen und verursachen keine zusätzliche Last auf den Exchange Servern.
Die URLs für Exchange 2016 und Exchange 2013 SP1 lauten wie folgt:
- https://<ExchangeServer>/owa/healthcheck.htm
- https://<ExchangeServer>/ecp/healthcheck.htm
- https://<ExchangeServer>/rpc/healthcheck.htm
- https://<ExchangeServer>/mapi/healthcheck.htm
- https://<ExchangeServer>/ews/healthcheck.htm
- https://<ExchangeServer>/oab/healthcheck.htm
- https://<ExchangeServer>/Microsoft-Server-ActiveSync/healthcheck.htm
- https://<ExchangeServer>/autodiscover/healthcheck.htm
Auch für die Fehlerdiagnose können die HealthCheck URLs hilfreich sein, etwa wenn nach einem Update die ComponentStates nicht wieder in den Status “Aktiv” gesetzt werden.
Mit diesem kleinen PowerShell Script, lassen sich die HealthCheck URLs abfragen:
$ExchangeServer = "EXSRV1.frankysweb.local" #$AllProtocols = [System.Net.SecurityProtocolType]'Tls11,Tls12' #[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols $OWA = "https://$ExchangeServer/owa/healthcheck.htm" $ECP = "https://$ExchangeServer/ecp/healthcheck.htm" $RPC = "https://$ExchangeServer/rpc/healthcheck.htm" $EWS = "https://$ExchangeServer/ews/healthcheck.htm" $MAPI = "https://$ExchangeServer/mapi/healthcheck.htm" $OAB = "https://$ExchangeServer/oab/healthcheck.htm" $EAS = "https://$ExchangeServer/Microsoft-Server-ActiveSync/healthcheck.htm" $AutoDiscover = "https://$ExchangeServer/autodiscover/healthcheck.htm" $OWAResponse = (Invoke-WebRequest -Uri $OWA).RawContent if ($OWAResponse -match "200 OK ") { write-host "OWA: OK" -foregroundcolor green } else { write-host "OWA: Fehler" -foregroundcolor red } $ECPResponse = (Invoke-WebRequest -Uri $ECP).RawContent if ($ECPResponse -match "200 OK ") { write-host "ECP: OK" -foregroundcolor green } else { write-host "ECP: Fehler" -foregroundcolor red } $RPCResponse = (Invoke-WebRequest -Uri $RPC).RawContent if ($RPCResponse -match "200 OK ") { write-host "RPC: OK" -foregroundcolor green } else { write-host "RPC: Fehler" -foregroundcolor red } $EWSResponse = (Invoke-WebRequest -Uri $EWS).RawContent if ($EWSResponse -match "200 OK ") { write-host "EWS: OK" -foregroundcolor green } else { write-host "EWS: Fehler" -foregroundcolor red } $MAPIResponse = (Invoke-WebRequest -Uri $MAPI).RawContent if ($MAPIResponse -match "200 OK ") { write-host "MAPI: OK" -foregroundcolor green } else { write-host "MAPI: Fehler" -foregroundcolor red } $OABResponse = (Invoke-WebRequest -Uri $OAB).RawContent if ($OABResponse -match "200 OK ") { write-host "OAB: OK" -foregroundcolor green } else { write-host "OAB: Fehler" -foregroundcolor red } $EASResponse = (Invoke-WebRequest -Uri $EAS).RawContent if ($EASResponse -match "200 OK ") { write-host "EAS: OK" -foregroundcolor green } else { write-host "EAS: Fehler" -foregroundcolor red } $AutodiscoverResponse = (Invoke-WebRequest -Uri $Autodiscover).RawContent if ($AutodiscoverResponse -match "200 OK ") { write-host "Autodiscover: OK" -foregroundcolor green } else { write-host "Autodiscover: Fehler" -foregroundcolor red }
Die Ausgabe des Scripts ist simpel und kann daher nur zur ersten Diagnose dienen (wenn überhaupt):
Ich erhalte beim Aufruf des Invoke-WebRequest folgende Fehlermeldung:
Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
At line:12 char:17
+ $OWAResponse = (Invoke-WebRequest -Uri $OWA).RawContent
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
OWA: Fehler
Any idea?
Kann es am TLS liegen?
[Net.ServicePointManager]::SecurityProtocol
Tls, Tls11, Tls12, Tls13
Hallo Franky, das schöne Script hat bei mir zu Hause 3 Fehler aufgeführt. EWS, MAPI und Autodiscover. Habe mal ein Get-ServerHealth meinserver.domaene.de | ?{$_.HealthSetName -eq „EWS“} ausgeführt und Fehler im EWSCtpMonitor angezeigt bekommen. Mit einem Invoke-MonitoringProbe habe ich dann mir anzeigen lassen wo der Fehler ist. Komisch ist nur das die gleiche Einrichtung eines anderen Exchange-Servers in der Firma ohne Fehler funktioniert hat. Habe schon diverse Parameter im IIS verglichen ohne abweichungen zu sehen…..vielleicht hat jemand das Problem gelöst… Rückmeldung 401 hat doch mit dem IIS zu tun.
Hier der Auszug:
EwsUrl=https://localhost/ews/exchange.asmx
UserName/Password=HealthMailbox………@MeineDomaene.de/:XIR6E7FO;)ng)tLb2
/y!fSuAKfLKI%{[r77cp$6oAmr]ch+b*SwC3ZH^Nd9=X=_jTZaoK6m2V&Z!3F|MzT%8Tf[Tn^Ei6vZ(RgSyJ9S^e[==d%iT+G=
%n.TG(;SbxQ)
AuthMethod=Negotiate
GetFolder (Attempt #0) Status=The request failed. Der Remoteserver hat einen Fehler
zurückgegeben: (401) Nicht autorisiert.
GetFolder (Attempt #0) Latency=141,1585
(Attempt #0) X-FEServer=MeinServer
GetFolder (Attempt #1) Status=The request failed. Der Remoteserver hat einen Fehler
zurückgegeben: (401) Nicht autorisiert.
GetFolder (Attempt #1) Latency=46,8636
(Attempt #1) X-FEServer=MeinServer
bei Microsoft.Exchange.Monitoring.ActiveMonitoring.Ews.Probes.EWSCommon.RetrySoapActionAndThrow
(Action operation, String soapAction, ExchangeServiceBase service, CancellationToken
cancellationToken, Boolean trackLatency)
bei Microsoft.Exchange.Monitoring.ActiveMonitoring.Ews.Probes.EWSGenericProbeCommon.PerformEWSO
peration(ExchangeService service, String operation, Boolean trackLatency, CancellationToken
cancellationToken)
bei Microsoft.Exchange.Monitoring.ActiveMonitoring.Ews.Probes.EWSGenericProbeCommon.ExecuteEWSC
all(String endPoint, String operation, Boolean verifyAffinity, CancellationToken
cancellationToken, Boolean trackLatency)
bei Microsoft.Exchange.Monitoring.ActiveMonitoring.Ews.Probes.EWSGenericProbeCommon.DoWorkInter
nal(CancellationToken cancellationToken)
Exception : System.Exception: System.Exception: System.Exception:
>>> PRIMARY ENDPOINT VERIFICATION