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.
Die Logs in Exchange 2010 sind sehr viel einfacher und überschaubarer als die Exchange 2000/2003 Pendants. 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. Wer hier aber nicht per PowerShell agiert, sondern direkt an die CSV-Dateien geht, wird feststellen, dass es hier immer zwei Dateinamensmuster gibt. Am 26. Feb 2012 konnten 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
Sie folgenden dem folgenden Namensschema.
- 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.
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 Allowlist anbieten, damit Antworten auf ausgehende Mails auch angenommen werden.
# PowerShell Script collects outgoing SMTP-messages and dumps recipients # can be used für dynamic Allowlisting 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: |
Für den Eintrag zuständige Quelle. |
10 |
event-id* |
eines aus: |
Beschreibt die jeweilige Aktion dieses Eintrags
|
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 |
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
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. |
Weitere Links
- Exchange 2000/2003 Nachrichtentracking
- Exchange 5.5 Nachrichtentracking
- MTRACK Auswertung von Trackinglogs
- Reporting
- MsgTrackSum
- Duplicate MessageID
- PowerShell Beispiele
-
Message Tracking in Exchange Server 2007
http://technet.microsoft.com/en-us/library/cc539075.aspx - Information Written to the Message Tracking Log
http://technet.microsoft.com/en-us/library/cc539063.aspx - Description of Message Tracking Log Fields
http://technet.microsoft.com/en-us/library/cc539064.aspx - Process Tracking Log tool für Exchange Server 2007
http://blogs.technet.com/b/exchange/archive/2008/02/07/448082.aspx - How does duplicate detection work?
http://blogs.technet.com/b/exchange/archive/2004/07/14/183132.aspx - Exchange Web Services Reference - FindMessageTrackingReport
http://msdn.microsoft.com/en-us/library/dd899448.aspx - Exchange 2007 / Exchange 2010: Täglicher Report über Messagestatistik
http://www.roland-ehle.de/archives/997
Update: Exchange 2007 / 2010 – tägliche Messagingstatistik
http://www.roland-ehle.de/archives/1001 - PowerShell cmdlet to track emails send to one specific email id/mailbox/DL
http://msexchangeguru.com/2011/05/10/track-emails/