Nachrichtentracking Exchange 2007/2010

Mit Exchange 2007 hat Microsoft das Nachrichtentracking erneut komplett umgestellt. Es wurde sowohl das Format aber auch die Schnittstelle für den Zugriff geändert. So ist es nicht mehr möglich, per WMI auf das Messagetracking zuzugreifen. Damit ist auch kein transparentes Tracking mehr über Server hinweg möglich. Man startet bei einem Server und sieht die Logs eher wie eine Datenbank und über die MessageID hangelt man sich dann von Server zu Server durch. Beim Übergang nach Exchange 2003 endet dieser Mechanismus und man muss das Programm zum Exchange System Manager wechseln.

Protokollierung einstellen

Im Gegensatz zu Exchange 5.5, 2000 und 2003 muss bei Exchange 2007 die Protokollierung per PowerShell aktiviert werden. Einträge im Messagetracking sind nicht für alle Rollen verfügbar:

  • Hub Transport Server
  • Edge Server
  • Mailbox Server

Die CAS und UM-Rolle hingegen schreiben kein Messagetracking-

Zur Aktivierung dienen die entsprechenden "Set-Transportserver" und "Set-Mailboxserver" Commandlet. Hier zwei Beispiele um alle Server identisch einzustellen: 

Get-Transportserver | Set-TransportServer
 -MessageTrackingLogEnabled $true
 -MessageTrackingLogPath d:\TrackingLogs
 -MessageTrackingLogMaxFileSize 10MB
 -MessageTrackingLogMaxDirectorySize 250MB
 -MessageTrackingLogMaxAge 30
 -MessageTrackingLogSubjectLoggingEnabled $true

Get-Mailboxserver | Set-MailboxServer
 -MessageTrackingLogEnabled $true
 -MessageTrackingLogPath d:\TrackingLogs
 -MessageTrackingLogMaxFileSize 10MB
 -MessageTrackingLogMaxDirectorySize 250MB
 -MessageTrackingLogMaxAge 30
 -MessageTrackingLogSubjectLoggingEnabled $true

Über das "GET-" commandlet holt sich der Befehl die Liste der Server, auf die dann die Werte gesetzt werden. Natürlich sollten Sie zumindest prüfen, ob die Pfadangabe für alle Server geeignet ist. Das Beispiel begrenzt die Größe einer einzelnen Datei auf 10 Megabyte. Dann startet Exchange die nächste Protokolldatei. Die ältesten Dateien werden gelöscht, wenn diese älter als 30 Tage oder das Verzeichnis größer als 250 Megabyte ist. Auch hier müssten Sie natürlich die für ihre Umgebung passenden Werte finden, die vom Standard abweichen können. Wer dedizierte Hub Transport Server hat, wird dort den Bereich größer wählen. Auch das Standardverzeichnis (C:\Programme\Microsoft\Exchange Server\TransportRoles\Logs\MessageTracking) ist natürlich ungünstig, wenn damit die Systempartition zuläuft.

Trackingverzeichnis

Man sieht hier natürlich genau, dass es noch weitere Verzeichnisse mit möglichen Protokolldateien geben kann. Es ist kein Problem, die beiden Rollen in das gleiche Verzeichnis tracken zu lassen, da sich der Dateiname unterscheidet.

  • Edge/ Transport: MSTRKyyymmdd-nnnn.log
  • Mailbox: MSTRKMyyymmdd-nnnn.log

Dabei ist "nnnn" eine laufende Nummer. Insofern kann ein Exchange Server erst einmal nicht mehr als 9999 Logfiles anlegen. Bei einer Defaultgröße von 10 Megabyte sind das aber dann 100 Gigabyte Logs pro Tag. Wenn ihr Server wirklich an diese Grenze stoßen sollte, dann können Sie die Dateigröße einfach vergrößern. Bei solchen Volumen werden Sie aber eh nicht um eine Übertragung in eine SQL-Datenbank o.ä. hinweg kommen, da eine Auswertung (und dazu schreibt man ja die Logs) sonst nicht mehr effektiv möglich sein wird.

Kompression

Ein Tipp am Rande. Die Protokolldateien sind reine Textdateien. Sie sollten bei geringem Platz auf der Festplatte überlegen, das Verzeichnis zu komprimieren. Die Protokolldateien werden oft auf 1/4 des ursprünglichen Platzes verdichtet. Wer die Dateien mit einem Packer komprimiert, kommt oft auf noch geringere Dateigrößen. Das erlaubt es auch mehr als die üblichen 7 oder 30 letzten Tage vorzuhalten.

Nachtracken mit dem Exchange 2007 Message Tracking

Es gibt zwei Wege, diese Protokolldateien auszuwerten. Zum einen ist eine Auswertung per Exchange Message Tracking möglich. Das entsprechende Programm finden Sie in der Toolbox der Exchange Management Console.

Messagetracking in der Toolbox

Der Assistent erfragt dann die gewünschten Filterkriterien:

Unten zeigt der Assistent an, wie die entsprechende Kommandozeile für die Auswertung lautet. Das Ergebnis ist dann eine Ansicht, die eher an eine Datenbankabfrage erinnert. Exchange 2003 Administratoren werden sich umgewöhnen müssen.

Vor allem, weil man keinen "Laufweg" sehen kann. Wenn man also sieht, dass eine Mail per SMTP an einen anderen Server gesendet wurde, dann muss man diese Zeile Anklicken und unten auf "NEXT" drücken. Dann kommt man zum vorherigen Bild zurück, indem die Daten als Filterkriterien übernommen sind. müssen Sie also eine Mail über mehrere Server hinweg nachverfolgen, dann ist es ein relativ beschwerlicher Weg. Es dürfte sich hier aber bald ein Markt von Zusatzprogrammen bilden, die genau das ermöglichen.

Messagetracking mit der PowerShell

Weiterhin können Sie natürlich auch die PowerShell bemühen. Das Commandlet "Get-MessageTrackingLog" ist hierzu einzusetzen

Get-MessageTrackingLog -ResultSize unlimited -Start "4/13/2006 0:00AM" -End "4/13/2007 12:00PM" -EventId "Fail" -Sender "user@domain.tld"

Diese Abfrage liefert ihnen alle fehlerhaften Mails des angegebenen Absenders für die weiterer Verarbeitung oder ganz ohne Filterung:

Get-MessageTrackingLog -ResultSize unlimited -EventId "Fail"

Alternativ können Sie natürlich über die PowerShell-Verkettung weiter suchen. Prüfen Sie aber genau, welche Filter sie schon bei Get-messagetrackingLog verwenden können, da sie immer besser sind als ein nachfolgendes "Where".

# Schlecht
Get-MessageTrackingLog | where {$_.source -eq "SMTP" -and $_.eventid -eq "SEND"}

Besser:

Get-MessageTrackingLog -EventID "SEND" | where {$_.source -eq "SMTP" }

Natürlich kann man mit etwas mehr PowerShell dann auch eine ganze Auswertung aufbauen. Hier z.B.: ein rudimentäres Skript, um aus allen per SMTP übertragenen Mails die Empfänger auszulesen und gegen eine Liste von "lokalen" Domänen zu vergleichen. Die Liste könnten Sie z.B. ihrem Spamfilter als temporäre Whitelist anbieten, damit Antworten auf ausgehende Mails auch angenommen werden.

# PowerShell Script collects outgoing SMTP-messages and dumps recipients
# can be used für dynamic whitelisting für other spamfilters

$localdomains = @{"msxfaq.de"=1 ;"msxfaq.com"=1 }
$allrecipient = @{}

function addrecipient {
	param(
		[string]$name
	)
	
	if ($localdomains.contains($name.split("@")[1].tolower())){
		Write-HOST "SKIP Recipient $name is local"
		}
	elseif ($allrecipient.contains($name)) {
		Write-Host "DONE Recipient $name already in List"
		}
	else {
		$allrecipient.add($name,$true)
		Write-Host "ADD  Recipient $name added to List"
		}
	}


get-MessageTrackingLog -EventId "SEND" -ResultSize unlimited | foreach {
	$entry = $_
	Write-Debug "Processing $entry.subject"
	if ($entry.recipientcount -eq 0) {
		write-error "Log without recipient found"
		}
	elseif ($entry.recipientcount -eq 1) {
		addRecipient($entry.recipients[0])
		}
	else {
		foreach ($recipient in $entry.recipients) {
			addRecipient($recipient )
			}
		}
	}

$allrecipient.keys | Out-File -FilePath c:\exernuser.txt

Natürlich können Sie die Liste der lokalen Domänen auch einfach über "Get-AcceptedDomains" auslesen und selbst die Gültigkeit der Adressen über eine GC-Anfrage erledigen lassen. Auch sollten Sie die Anfrage von "Get-MessageTrackingLogs" mit Start und Ende einschränken, da das Skript sonst bei jedem Aufruf ALLE Logs durchliest. Dann wäre das Skript aber nicht mehr so übersichtlich.

Das Format Protokolldateien

Die Protokolldateien sind einfache Textdateien, welche einen einfachen Datensatzaufbau haben. er ist mit dem Aufbau einer IISLogs vergleichbar.

  • Die Datei enthält einen Headerbereich
  • Die Datei enthält Datensätze Überschriften bzw. Feldbezeichnungen
  • Die Datensätze sind durch einen Leerzeile (CR LF) voneinander getrennt
  • Die einzelnen Felder sind durch Semikolons (;) voneinander getrennt

Hier ein Auszug aus einer Trackingdatei. Zur besseren Lesbarkeit habe ich Zeilen durch eine zusätzliche Leerzeile getrennt.

#Software: Exchange
#Version: 8.0.0.0
#Log-Type:
#Daten:
#Fields

#Software: Microsoft Exchange Server
#Version: 8.0.0.0
#Log-type: Message Tracking Log
#Date: 2007-09-12T00:11:18.420Z
#Fields: date-time,client-ip,client-hostname,server-ip,server-hostname,source-context,connector-id,source,event-id,internal-message-id,message-id,recipient-address,recipient-status,total-bytes,recipient-count,related-recipient-address,reference,message-subject,sender-address,return-path,message-info

2007-09-12T00:16:27.174Z,192.168.100.12,,192.168.100.11,SRV01,08C9B81B05B89C78;2007-09-12T00:16:26.487Z;0,SRV01\Default SRV01 (anonym addiert),SMTP,RECEIVE,15899,<MessageID12345>,fcarius@domain.tld,,3964,1,,,"Dies ist der Betreff",sender@domain.tld,SRS0=3U1i7BKW=OI=domain2.tld=sender@domain.tld,00A:

2007-09-12T00:16:27.284Z,,,,SRV01,/o=Net at Work GmbH/ou=Paderborn/cn=Recipients/cn=fcarius,,ROUTING,RESOLVE,15899,<MessageID12345>,
frank.carius@domain.tld,,3964,1,fcarius@domain.tld,,"Dies ist der Betreff",sender@domain.tld,SRS0=3U1i7BKW=OI=domain2.tld.com=sender@domain.tld,

2007-09-12T00:16:28.346Z,,SRV01,,SRV01,,,STOREDRIVER,DELIVER,15899,<MessageID12345>,
frank.carius@domain.tld,,4269,1,,,"Dies ist der Betreff",
sender@domain.tld,SRS0=3U1i7BKW=OI=ldomain2.tld=sender@doma
in.tld,2007-09-12T00:16:26.674Z

Man kann gut erkennen, dass die erste Zeile den SMTP-Empfang über den "Receive Connector" beschreibt, während die zweite Zeile dann den Directory Lookup protokolliert und die dritte Zeile dann die Zustellung an das Postfach belegt.

In der Protokolldatei ist aber keine Information über den Inhalt der Mail oder Namen von Anlagen oder deren Inhalte verfügbar. Maximal der Betreff kann mit protokolliert werden. Sollen solche weitergehende Informationen gewünscht werden, dann ist der Weg über einen Transport Agent (Siehe auch MSXFAQ.DE- Transportagenten) eine Möglichkeit.

Datenbankformat

Exchange 2007 hat natürlich auch noch ein anderes Datenbankformat wie die vorherigen Versionen. Aber auch dieses ist von Microsoft gut dokumentiert. Es ist einfach eine Textdatei mit kommagetrennten Werten.

Feld Name Format Beschreibung
1 date-time* yyy-mm-ddThh:mm:ss:fff UTC Zeitstempel des Eintrags (auf hundertstel genau)
3 client-ip xxx.xxx.xxx.xxx IP-Adresse des Clients, der die Nachricht an den Server zustellt
4 client-hostname xxxxx Name des einliefernden Systems
5 server-ip xxx.xxx.xxx.xxx IP-Adresse des Zielservers.
6 server-hostname xxxx Name des Zielservers
7

source-context

xxxx Zusätzliche Informationen zur Quelle
8

connector-id

  Name des Send oder Receive Connectors dieser Verbindung
9 source* eines aus:
ADMIN, AGENT, DSN, GATEWAY, PICKUP, ROUTING, SMTP, STOREDRIVER
Für den Eintrag zuständige Quelle.
10 event-id* eines aus:
BADMAIL, DEFER, DELIVER, DSN, EXPAND, FAIL, POISONMESSAGE, RECEIVE, REDIRECT, RESOLVE, SEND, SUBMIT, TRANSFER

Beschreibt die jeweilige Aktion dieses Eintrags

  • BADMAIL
    Fehlerhafte Mails aus dem Pickup oder Replay Verzeichnis, die nicht zugestellt werden konnte
  • DELIVER
    Nachricht wurde in das Postfach zugestellt
  • DEFER
    Nachricht wurde verzögert
  • DSN
    Statusmeldung (Zustellbar oder unzustellbar) wurde erzeugt
  • EXPAND
    Ein Verteiler wurde in die Einzelempfänger aufgelöst.
  • FAIL
    Fehler bei der Zustellung der Mail.
  • POISONMESSAGE
    Nachricht wurde als gefährlich eingestuft und in die "Poison message queue" einsortiert oder von dort entfernt.
  • RECEIVE
    Empfangene Nachricht wurde in die Datenbank geschrieben.
  • REDIRECT
    Mail wurde an einen alternativen Empfänger umgeleitet. (Weiterleitung eines Postfachs im Active Directory)
  • RESOLVE
    Der Empfänger wurde anhand des Active Directory an eine andere Adresse umgelenkt (Kontakte).
  • SEND
    Nachricht wurde per SMTP an anderen Server übertragen.
  • SUBMIT
    Nachricht wurde vom Mailboxserver zum Versand an den Hub Transport Server/Edge Server eingestellt. Auf dem Mailbox Server finden sich im Messagetracking nur SUBMIT Events.
  • TRANSFER
    Nachrichte wurde aufgrund von Inhaltskonvertierung, Agenten oder Empfängergrenzen aufgeteilt.
  • DUPLICATE
    Der Informationsspeicher an eine "doppelte" Mail erkannt und gelöscht.
    Duplicate MessageID
11

internal-message-id*

xxxxx Internet MessageID, die durch den verarbeitenden Server individuell vergeben wird. Dieser Eintrag kann von Server zu Server auf für die gleiche Mail variieren.
12 message-id xxxxxxx Diese MessageID entspricht dem Eintrag im Header der Mail und ist auf allen System gleich.
13 recipient-address* user@domain.tld Mailadresse des Empfängers. Mehrere Empfänger sind durch Semikolon (;) voneinander getrennt
14

recipient-status

E2007: SEND oder FAIL
Ex2010: SMTP Status oder auch Ordnernamen wenn regeln die Mail verschieben
Status für den Empfänger
15 total-bytes* NNNNN Größe der Nachricht in Bytes
16 recipient-count* NNNNN Anzahl der Empfänger dieser Nachricht
17 related-recipient-address user@domain.tld Nur in Verbindung mit EXPAND, REDIRECT und RESOLVE. Listet weitere Empfänger auf
18 reference xxxx Enthält weiterer Details zu den folgenden Vorgängen
  • DSN 
    Interne MessageID, die für die Statusmeldung auslösend ist
  • SEND
    Enthält die offizielle MessageID für DSN-Mails
  • TRANSFER
    Enthält die interne Internal-MessageID der aufgeteilten Nachricht

Für alle anderen Einträge ist das Feld leer

19 message-subject xxxxx Enthält den Betreff, wenn die Protokollierung des Betreffs aktiviert ist. (per Default AN)
20 sender-address user@domain.tld Enthält den Sender der Mail aus dem Headerfeld "Sender:". Ist das Feld nicht vorhanden, wird das Feld "From:" ausgewertet
21 return-path* user@domain.tld Enthält die Mailadresse aus "MAIL FROM" zur Rückantwort. Das Feld kann nicht leer sein aber kann "<>" enthalten.
22 message-info ddThh:mm:ss.fffZ Für DELIVER und SEND-Vorgänge enthält diese Feld den Zeitpunkt, wann die Mail die Exchange Organisation erreicht hat. 

Der Weg einer Mail

Hier ist zu beachten, dass der Mailboxserver selbst an den Server nur eine Benachrichtigung gibt, die Sie auf dem Mailboxserver finden, auch wenn dieser keine HubTransport-Rolle hat. Allerdings gibt es hier nicht mehr die einfache numerische EventID, sondern die Felder "SOURCE" und EVENTID.

Internet
->MB
MB->
Internet
MB->MB
Local
Site2Site
Sender
Site2Site
Receiver
Beschreibung (Siehe KB 821905)
RECEIVE
SMTP

RECEIVE
MAILBOXRULE




DELIVER
STOREDRIVER
RECEIVE
STOREDRIVER

TRANSFER
ROUTING

SEND
SMTP




SUBMIT
STOREDRIVER
RECEIVE
STOREDRIVER







DELIVER
STOREDRIVER

SUBMIT
STOREDRIVER
    Mail vom Store abgeholt
oder per SMTP Empfangen

Route


Per SMTP versendet


Zugestellt


Mail nach "gesendete Objekte" verschoben

Die Logs in Exchange 2010 sind sehr viel einfacher und überschaubarer als die Exchange 2000/2003 Pendants. Wer hier aber nicht per PowerShell agiert, sondern direkt an die CSV-Dateien geht, wird feststellen, dass es hier immer zwei Dateien gibt. Am 26. Feb 2012 könnten Sie folgende Dateien finden

  • MSGTRK20120226-1.LOG
    Enthält das komplette Log mit allen einzelnen Schritte
  • MSGTRKM20120226-1.LOG
    Enthält eine Zusammenfassung, in der es pro Mail nur genau eine Zeile gibt

Für Auswertungen nach dem Volumen würde also schon die zweite Datei ausreichend sein.

Weitere Links