parse-ActiveSyncDebugLog

Die Idee

Das Problem
Exchange Server speichern Mailboxen, auf die wir gerne mit unseren Mobile Devices zugreifen. Mit einer richtigen Konfiguration ist das auch einfach möglich. Aber manchmal verweigern Smartphones die Synchronisierung. Für eine Problemdiagnose liegen dann oftmals keine sinnvollen Fehlermeldungen oder Logfiles im Gerät vor. Hier kann der Exchange Server helfen.
Die Microsoft-Lösung
Im on-premise Exchange Server kann ab der Version 2010 das so genannte ActiveSyncDebugLog aktiviert werden. Dieses stellt dann sehr detailliert die Kommunikation zwischen Endgerät und dem ClientAccessService dar.

Wichtig sind an dieser Stelle folgende Informationen:

  • Das Logging ist nicht standardmäßig aktiv
  • Das Logging muss pro Mailbox aktiviert werden.
  • Ein aktiviertes Logging wird sehr viele Logdaten pro Mailbox sammeln.
  • Daher wird ein aktiviertes Logging vom Exchange Server nach 72 Stunden automatisch deaktiviert.
  • Das Logfile liegt als Fließtext vor und kann über die PowerShell abgefragt werden.

So schaut es im Normalfall aus. Das Logging ist deaktiviert:

parse-ActiveSyncDebugLog

Mit der PowerShell kann das Logging aktiviert werden. Der Zustand wird in meinem Exchange Server aber nicht korrekt dargestellt:

parse-ActiveSyncDebugLog

Nach der Aktivierung kann dann das Problemgerät erneut synchronisiert werden. Das Ergebnis kann mit der PowerShell abgefragt werden. Bei der Abfrage wird der Schalter -GetMailboxLog benötigt. Damit wird die zusätzliche EigenschaftMailboxLogReport ausgelesen:

parse-ActiveSyncDebugLog

Das MailboxLog ist ein Fließtext. Hier habe ich den Text mal zur Analyse extrahiert. Die einzelnen Verbindungen zwischen dem Device und dem Exchange Server sind als Log Entry aufgezeichnet. In jedem Log Entry gibt es dann mehrere Attribute mit Werten. Die Attribute habe ich mal farblich markiert:

parse-ActiveSyncDebugLog

parse-ActiveSyncDebugLog

parse-ActiveSyncDebugLog

Durch diese Darstellung wird deutlich, wie ActiveSync funktioniert:

  • Der Clients schickt einen Request (RequestBody) zum Server. Darin ist auch eine Authentifizierung (im RequestHeader) enthalten.
  • Der Server prüft die Authentifizierung (AccessState, AccessStateReason) und senden eine Antwort (ResponseHeader, ResponseBody) zum Client.
Probleme mit der Microsoft-Lösung
Die Responses können sehr groß werden. Auf meinem Testclient wurde von einem vollständig im Sync stehenden Device innerhalb von 15 Minuten 2300 Zeilen Log generiert. Ebenso ist das Auffinden von Fehlern in dieser Darstellung nicht wirklich einfach.

Dazu kann ein Mailboxbenutzer durchaus mehrere ActiveSync-Devices mit seiner Mailbox verbunden haben. Die Logfiles werden pro Device gespeichert. Ohne Angabe des Devices werden also die Logdaten mehrerer Devices miteinander vermischt. Vorab muss also das ggf. passende Device gesucht werden.

Meine Lösung: parse-ActiveSyncDebugLog
Die Suche nach dem richtigen ActiveSync-Device ist kein wirkliches Problem. Das Lesen und Analysieren des Logtextes aber schon. Und da setzt meine Lösung auf.

Der Text im Logfile folgt einer gewissen Struktur. Meine PowerShell-Funktion parst diese Struktur und erstellt daraus ein PowerShell-Object. Dieses lässt sich wie gewohnt filtern, sortieren bzw. weiterverarbeiten. Dazu habe ich verschiedene Ausgabeoptionen, wie eine optimierte Tabellenausgabe und eine GridView-Ausgabe integriert. Und eine Suche für das ActiveSync-Device ist natürlich auch dabei.

Wie gewohnt sind im oberen Teil des Scriptes die Arbeitsfunktionen enthalten. Meine Funktion „verbinde-MX“ stellt die Verbindung zum Exchange Server her. Im unteren Teil habe ich einige Beispielaufrufe abgelegt. Und natürlich ist auch die Aktivierung des Loggings mit dabei:

parse-ActiveSyncDebugLog

Anwendung des Scriptes

Device-Suche und Object-Ausgabe
Nachdem das Logging aktiviert und ein Sync durchgeführt wurde, kann die Funktion für die Mailboxbenutzerin in meinem Beispiel aufgerufen werden. Wie eingangs erwähnt kann ein Benutzer mehrere Devices verbunden haben. Und hier gibt es dann verschiedene Szenarien:
  • Findet meine Funktion kein Device, wird einfach eine Fehlermeldung zurückgegeben.
  • Wird nur ein Device gefunden, dann wird für dieses Device direkt die Ausgabe des Logfiles angezeigt.
  • Sind mehrere Devices registriert, dann wird über ein GridView die Device-Abfrage gestartet. Es sind hier ein oder mehrere Devices möglich. Die Informationen zum Auffinden des richtigen Devices werden natürlich mit angezeigt:

parse-ActiveSyncDebugLog

Danach wird das geparste Logfile im Listenformat ausgegeben. Man erkennt sehr schön die einzelnen Bestandteile aus dem Logfile. Links sind die Attribute und rechts deren Werte notiert. Je Log-Entry wird ein Object ausgegeben:

parse-ActiveSyncDebugLog

Die Daten können z.B. mit Where-Object oder Export-CSV über die Pipeline einfach weiterverarbeitet werden.

Gridview-Ausgabe
Für einen schnellen Blick ist das PowerShell.Object eher weniger geeignet. Daher kann über den Parameter -Output GridView ein Gridview mit den bekannten Filteroptionen anstelle des PowerShell-Objects ausgegeben werden:

parse-ActiveSyncDebugLog

(formatierte) Tabellen-Ausgabe
Ebenso ist aber auch eine tabellarische Anzeige sinnvoll. Natürlich könnte der Befehl auch an Format-Table gepiped werden. Aber das Ausgabeobject hat sehr viele Spalten. Viele werden nicht direkt weiterhelfen. Um eine aufwändige Aussortierung zu ersparen habe ich hinter dem Parameter -output FormatTable eine vorgefilterte Tabelle verbaut. So gelingt der Überblick sehr einfach:

parse-ActiveSyncDebugLog

Achtung: Diese Ausgabeform kann nicht mehr mit der Pipeline weiterverarbeitet werden!

HTML-Ausgabe
Vielleicht ist euch die Visualisierung im Browser lieber? Kein Problem: mit -output html wird eine html-Datei erzeugt und automatisch im Standard-Browser geöffnet:

parse-ActiveSyncDebugLog

weitere Parameter und deren Kombinationen
Natürlich ist eine Hilfe in der Funktion enthalten. Hier gibt es ausführliche Erklärungen und viele Beispiele zum Verständnis:

parse-ActiveSyncDebugLog

Download

Hier könnt ihr euch die Funktion in einem PowerShell-Script herunterladen: ActiveSyncDebugLogging.zip. Und wie gewohnt stelle ich diesen Artikel auch wieder als PDF-Datei bereit: ActiveSyncDebugLogging.pdf

Stay tuned!

Kommentar hinterlassen