Exchange 2016: HealthCheck URLs für Loadbalancer

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:

Loadbalancer

“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):

image

2 thoughts on “Exchange 2016: HealthCheck URLs für Loadbalancer”

  1. 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

    Reply
  2. 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

    Reply

Leave a Comment