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

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:

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

Weitere Links