FixCategories
Anwender können in Outlook mit Kategorien arbeiten, um Elemente zu gruppieren und zu filtern. Das Ganze funktioniert natürlich auch in öffentlichen Ordnern. Leider kann ein Anwender hier auch Sonderzeichen verwenden, die letztlich die Replikation von öffentlichen Ordnern zwischen Servern stören. Exchange 2010 ist nämlich ganz empfindlich, was den Inhalt bestimmter Fehler betrifft. Das muss sich nicht nur auf die Kategorien beziehen, sondern ist bei Terminen oft auch das Stadtdatum oder in Kontakten die Homepage, die Exchange 2010 auch "Gültigkeit" prüft, während frühere Versionen von Exchange da ziemlich unempfindlich waren.
Problemordner erkennen
Ob ein Ordner auf zwei Servern aktuell repliziert ist, kann man ansatzweise über die Größe oder die Anzahl der Element im Ordner pro Server ermitteln. Leider liefert Exchange 2000 diese Werte gar nicht per API aber Exchange 2003 erlaubt das Auslesen per WMI. Exchange 2007/2010 haben mit "Get-PublicFolderStatistics" einen passenden PowerShell-Befehl. Da bleibt nur noch das Auslesen der Ordner und der Vergleich.
Da das nicht jedermanns Sache ist, habe ich ein PowerShell-Skript dazu geschrieben:
Damit ist es möglich, die Ordnerliste und deren Größen von zwei Servern zu vergleichen und damit die Ordner zu ermitteln, die anscheinend nicht in Sync sind. Dann bleibt natürlich die Frage, wie man die Ursache ermitteln kann.
Fehlersuche mit Message Tracking
Eine Möglichkeit nach Fehlern zu suchen ist die Nachverfolgung im Messagetracking. Die Replikationsnachrichten der öffentlichen Ordner werden natürlich über den Transportdienst übertragen und der Transport Service am Ziel muss die Mails in den Store ablegen. Defekte Kategorien und andere Formatfehler führen auf dem Store zu entsprechenden Fehlern, da er sich weigert die Mails anzunehmen. Diese "Fehler" stehen auch im Messagetracking im Feld "Messageinfo"
get-messagetrackinglog -Server "mail" -resultsize unlimited | where {$_.messageinfo -ne ""} | ft timestamp,messageinfo
Seit einen mir nicht weiter bekannten Rollup Fix ist
das Feld MessagInfo nicht mehr leer, sondern enthält das Sendedatum der
Mail:
http://technet.microsoft.com/en-us/library/bb124375.aspx
Eine Änderung der Anfrage sollte aber auch das Problem lösen:
get-messagetrackinglog -Server "mail" -resultsize unlimited | where {$_.messageinfo -contains "store.exe"}} | ft timestamp,messageinfo
Da diese Mails ja nicht zugestellt werden, landen Sie auch im Messagetracking als "FAIL", was sich sehr einfach ermitteln lässt.
get-messagetrackinglog -Server "mail" -eventID FAIL
Allerdings haben Sie hier auch FAIL-Einträge, wenn ungültige Absender adressiert, Quotas überschritten etc. werden. Um eine genauere Information zu erhalten, sollten Sie die Abfrage noch mit der Mailadresse des Public Folders Senders oder Empfängers kombinieren.
Manchmal glaubt auch die Transport Rolle selbst die Mail als "schädlich" zu erkennen und schiebt diese in die Poison Queue. Ein Blick in die Poisonqueue hilft oder eine Suche im Messagetracking mit:
get-MessageTrackingLog -EventId "POISONMESSAGE"
Sie können die Mail dann wieder "frei" geben
- Nachrichtentracking mit Exchange 2007
- Some Public Folder content is not replicating from
Exchange 2003 to Exchange 2007
http://blogs.technet.com/dblanch/archive/2009/04/10/some-public-folder-content-is-not-replicating-from-exchange-2003-to-exchange-2007.aspx
Fehlersuchen über Pipelinetrace
Siehe dazu auch die Seite Pipelinetracing
Das erste Hilfsmittel der Wahl ist das Exchange 2007/2010 das Pipelinetracing. Diese Funktion erlaubt alle Schritte und Veränderungen , die eine Mail auf dem Weg durch den Transport Server durchläuft, zu verfolgen. Es wird pro Absenderadresse aktiviert, d.h. Sie nutzen die Mailadresse des öffentlichen Ordner Speichers von Exchange 2003 als Filter:
set-TransportServer `
-PipelineTracingEnabled $true `
-ContentConversionTracingEnabled $true `
-PipelineTracingPath "C:\Program Files\Microsoft\Exchange Server\TransportRoles\Logs\PipelineTracing" `
-PipelineTracingSenderAddress SRV01-IS@msxfaq.local
Im angegebenen Verzeichnis befindet sich dann im unterverzeichnis "ContentConversionTracing" je eine EML und eine TXT-Datei mit den problematischen Mails. Die Textdatei enthält den Hinweis auf den Fehler.
Microsoft.Exchange.Data.Storage.PropertyValidationException: Property
validation failed. Property = [{00020329-0000-0000-c000-000000000046}:'Keywords']
Categories Error = Element 0 in the multivalue property is invalid..
Microsoft.Exchange.Data.Storage.PropertyValidationException: Property
validation failed. Property =
[{00062004-0000-0000-c000-000000000046}:0x8092] Email2AddrType Error =
Email2AddrType is too long: maximum length is 9, actual length is 25
FAIL 554 5.6.0 STOREDRV.Deliver.Exception.ObjectValidation Failed to
process message due to a permanent exception
Microsoft.Exchange.Data.Storage.ObjectValidationException: The object is
invalid and cannot be saved
Der erste Fehler weist auf Kategorien hin während der zweite Fehler auf fehlerhafte Mailadressen in Kontaktordnern und Fehler 3 oft bei Terminen auftritt (fehlendes Endedatum etc.) Mit einem entsprechenden Debugging auf Exchange sehen Sie auch einen vergleichbare Meldung im Eventlog
In den meisten Fällen handelt es sich dabei um ein "Komma" in den Kategorien. Normalerweise ist dies nicht schädlich, da die verschiedenen Kategorien in dem Feld durch ein Semikolon ";" getrennt werden. Dennoch scheint Exchange 2010 Probleme damit zu haben, weil es auch ein Komma als Trenner in einem Array ansieht ?.
Gerne werden aber auch die folgenden Fehler genommen.
The store driver couldn't deliver the public folder replication message "Folder Content Backfill Response (Servername@domain)" because the following error occurred: The duration between startTime and endTime (1.01:30:00) of the recurrence is greater than the minimum duration between two occurrences (1.00:00:00)..
The store driver couldn't deliver the public folder replication message "Folder Content Backfill Response (Servername@domain)" because the following error occurred: Can't save invalid object Object Violation. Invalid property = [Calc:EndTime] EndTime. Invalid data für that property = 16.09.2011 09:30:00. Constraint violated = Property [Calc:StartTime] StartTime must be LessThanOrEqual when compared to property [Calc:EndTime] EndTime....
Vergessen Sie am Ende nicht wieder das "Pipeline Tracing" abzuschalten.
set-TransportServer `
-PipelineTracingEnabled $false `
-ContentConversionTracingEnabled : $false
Auch die BPOS Hilfe liefert hier mehr Infos:
- Pipelinetracing
- How to Enable Pipeline Tracing
http://technet.microsoft.com/en-us/library/bb125018.aspx - Managing Content Conversion Tracing
http://technet.microsoft.com/en-us/library/bb397226.aspx - Using Pipeline Tracing to Diagnose Transport Agent
Problems
http://technet.microsoft.com/en-us/library/bb125198.aspx - Content Conversion Tracing
http://technet.microsoft.com/en-us/library/bb397226.aspx - Public Folder Replication Troubleshooting
Part 1: http://blogs.technet.com/b/exchange/archive/2006/01/17/417611.aspx
Part 2: http://blogs.technet.com/b/exchange/archive/2006/01/19/417737.aspx
Part 3: http://blogs.technet.com/b/exchange/archive/2006/01/23/417974.aspx
Part 4: http://blogs.technet.com/b/exchange/archive/2008/01/10/447843.aspx
VBA Skript zum Bereinigen
Da sich in Ordnern sehr viele Elemente verbergen können und es mühsam ist, alle Kategorien abzusuchen, habe ich ein kleines VBA-Makro geschrieben, welches Sie einfach in Outlook ausführen können. Es fordert zur Auswahl eines Ordners auf und durchläuft alle Elemente, prüft die Kategorie und entfernt Kommata:
Sub FixCategory() Set objfolder = Outlook.GetNamespace("MAPI").PickFolder Dim Item As Object Dim count As Integer Dim Categories As String count = 0 für Each Item In objfolder.items count = count + 1 Debug.Print "Processing:" & count & ":" & Item.subject & ":" & Categories Categories = Item.Categories If instr(Categories, ",") > 0 Then Debug.Print "Replace " & Categories Item.Categories = Replace(Categories, ",", " ") Item.Save End If Next MsgBox "FixCategories finished" End Sub
Alternativ habe ich hier noch ein Skript, welches eine Positiv-Liste der erlaubten Zeichen nutzt. Leider habe ich keine Quelle, welche Zeichen wirklich erlaubt sind.
Sub FixCategory2() Const fixmode = False ' set to true to enable "fixing" Const ValidChar = "abcdefghijklmnopqrstuvwxyz0123456789 -;_." Set objFolder = Outlook.GetNamespace("MAPI").PickFolder Dim item As Object Dim count, charcounter As Integer Dim Categories As String Dim Newcategories As String Dim blnvalid As Boolean Dim colMatches count = 0 für Each item In objFolder.items count = count + 1 Debug.Print "Processing:" & count & ":" & item.subject & ":" & Categories Categories = item.Categories blnvalid = True Newcategories = "" für charcounter = 1 To Len(Categories) If InStr(1, ValidChar, Mid(Categories, charcounter, 1), vbTextCompare) Then Newcategories = Newcategories & Mid(Categories, charcounter, 1) Else blnvalid = False End If Next If Not blnvalid Then If fixmode Then item.Categories = Newcategories MsgBox "FIXING Invalid Categories in " & vbCrLf _ & "Subject: " & item.subject & vbCrLf _ & "Alt: " & Categories & vbCrLf _ & "Neu:" & Newcategories Debug.Print "Fixing:" & item.subject & ":" & Categories item.Save Else MsgBox "Invalid Categories found in " & vbCrLf _ & "Subject: " & item.subject & vbCrLf _ & "Alt: " & Categories & vbCrLf _ & "Neu:" & Newcategories Debug.Print "Found:" & item.subject & ":" & Categories End If End If Next End Sub
Das Skript bearbeitet immer nur einen Ordner. Wenn sie eine Lösung suchen, die z.B. alle öffentlichen Ordner durchläuft, dann ist es relativ einfach, dieses Skript in eine weitere FOR-Schleife zu stecken, die rekursiv die verschiedenen Ordner und unterordner durchläuft.
PowerShell
Mittlerweile gibt es von einem Microsoft Entwickler auch ein PowerShell-Skript
- Fixing Public Folder Replication Errors From Exchange 2003 to Exchange 2007 or 2010 http://blogs.technet.com/b/bill_long/archive/2010/04/22/fixing-public-folder-replication-errors-from-exchange-2003-to-exchange-2007-or-2010.aspx
Weitere Links
- PF Replikation
- Olk Kategorien
- PFReplCheck
- Pipelinetracing
- Outlook VBA
- TouchAllItems
- Replikation
- Public Folder Replication Troubleshooting - Part 4: Exchange Server 2007 tips
http://blogs.technet.com/b/exchange/archive/2008/01/10/447843.aspx - Some Public Folder content is not replicating from Exchange 2003
to Exchange 2007
http://blogs.technet.com/dblanch/archive/2009/04/10/some-public-folder-content-is-not-replicating-from-exchange-2003-to-exchange-2007.aspx - 842273 How to troubleshoot public folder replication problems in Exchange 2000 Server and in Exchange Server 2003
- 321082 XADM: How to Send Replication Status Request Messages in Exchange 2000 Server
- 813629 Update to send status request messages in Exchange 2000 Server
- Exchange Server 2003 How Replication Works
http://technet.microsoft.com/en-us/library/bb123618(EXCHG.65).aspx - Administration of Public Folders with the introduction of
Exchange 2007
http://blogs.technet.com/b/exchange/archive/2007/06/25/445429.aspx