Retention Policies und Tags

Die Retention-Funktion von Exchange erlaubt nicht nur die Vorgabe von Mindesthaltezeiten sondern kann auch Mails automatisiert löschen. Die Konfiguration von Richtlinien zu Compliance und Archiv-Gründen sollten Sie nur mit einer genauen Anforderungsaufnahme und Umsetzungsplanung angehen. Wenn Sie aber nur ein Funktionspostfach regelmäßig von Altlasten bereinigen wollen, dann ist ein gutes Beispiel die Funktion kennen zu lernen.

Eigentlich sollte die Seite nur beschreiben, Wie ich Postfächer von alten Inhalten befreie. Das dies bei mir auf Anhieb nicht geklappt hat, wurde die Seite immer länger, weil ich meine Lernkurve bei der Fehlersuche hier beschreibe. Vielleicht teile ich die Seite später einmal auf.

Lesen Sie zum grundlegenden Verständnis über MRM vorab bitte die Seite MRM Message Records Management oder "Messaging records management in Exchange Server" (https://learn.microsoft.com/en-us/exchange/policy-and-compliance/mrm/mrm) und "Retention tags and retention policies in Exchange Server" (https://learn.microsoft.com/en-us/exchange/policy-and-compliance/mrm/retention-tags-and-retention-policies)

Auslöser

In meinem Fall ist es ein Postfach, welches automatisierte Mails bekommt, die aber nur eine bestimmte Zeit relevant sind. Wenn ich z.B. PowerShell-Skripte automatisiert laufen lasse, dann protokollieren diese mehr oder minder umfangreich ihre Aktivitäten mit Start-Transcript in Daten und schreiben Fehler ins Eventlog. Aber wie oft schauen Sie selbst auf ihrem Server nach diesen Skripten oder suchen im Eventlog nach den wenigen Meldungen?. Da ist eine Mail an eine SharedMailbox ein legitimer Weg über den Start, das Ende und etwaige Fehler eines Skripts zu informieren. Als Administrator kann ich dann direkt in Outlook bei Rückfragen mit den Status anschauen.

Wenn es aber keine Probleme gibt, dann denke ich auch nicht immer daran, die Mails in diesem "Report Postfach" anzuschauen und zu löschen. Daher habe ich einen Weg gesucht, wie ich automatisiert Mails nach einem gewissen Alter in diesem Postfach löschen kann.

Sie finden sicher noch weitere Anwendungsfälle, z.B. sehe ich oft, dass Mail an "info@<firmenname>" in der Anfangszeit in einem Postfach landen aber sehr bald dann von einer ERP/CRM-Lösung per POP/IMAP ausgelesen aber nicht gelöscht werden. Auch hier kann die Einstellung von Retention Policies die erwünschte Bereinigung automatisch durchführen.

Es soll aber auch Fälle geben, in denen eine Mail nicht länger als unbedingt erforderlich aufbewahrt werden soll. Das hat dann weniger etwas mit Platzbedarf und Kosten sondern mit juristischen Aufgabenstellungen zu tun. Sie sind in Deutschland meines Wissens dazu verpflichtet, steuerrelevante Unterlagen 10 Jahre aufzubewahren. Danach dürfen Sie diese Wegwerfen aber müssen dies natürlich nicht. Aber vielleicht sollen oder wollen Sie dies dennoch sicherstellen, denn wenn in einem Streitfall ein Prüfer auch ältere Unterlagen findet, dann darf er sich auch mit einbeziehen.

Es soll ja besondere Richtlinien im Automobilsektor geben, um "verräterische Mails" (Stichwort Dieselskandal) so früh wie erlaubt zu löschen. Das ist aber nur hörensagen.

Es gibt also verschiedene Anforderungen und so habe ich das in meinem Labor einmal durchgespielt:

Ausgangssituation

Ich habe mein bekanntes "PowerShell Report Postfach" genommen, in dem seit Jahren die Berichte einlaufen und damit entsprechend "voll" ist. Hier möchte ich alle Mails löschen, die älter als 30 Tage sind. Hier haben sich im Laufe der Zeit einige Gigabyte angesammelt

[PS] C:\temp>Get-MailboxStatistics psreport | fl *size*

ItemCount                              : 143383
TotalDeletedItemSize                   : 587.3 MB (615,862,887 bytes)
TotalItemSize                          : 7.79 GB (8,364,221,673 bytes)
MessageTableTotalSize                  : 1.826 GB (1,960,181,760 bytes)
MessageTableAvailableSize              : 70.38 MB (73,793,536 bytes)
AttachmentTableTotalSize               : 15.73 GB (16,892,592,128 bytes)
AttachmentTableAvailableSize           : 7.563 MB (7,929,856 bytes)
OtherTablesTotalSize                   : 98.28 MB (103,055,360 bytes)
OtherTablesAvailableSize               : 2.656 MB (2,785,280 bytes)
SystemMessageSize                      : 0 B (0 bytes)
SystemMessageSizeWarningQuota          : 21.56 GB (23,149,873,725 bytes)
SystemMessageSizeShutoffQuota          : 22 GB (23,622,320,128 bytes)

Ich wollte mich aber auch nicht mehr mit Outlook, OWA, EWS o.ä. per Skript mit dem Postfach verbinden und alte Mails löschen. Diese Aufwand würde ich nun Exchange überlassen

Die Konfiguration der Retention erfolgt einem klaren Muster:

  • Ein Postfach hat genau eine Retention Policy
  • Eine Retention Policy fasst ein oder mehrere Retention Tags zusammen
  • Ein RetentionTags definiert ein Verhalten pro Postfach, Standardordner oder zur persönlichen Konfiguration

Mein Postfach hatte noch gar keine zugewiesene Retention Policy und daher bin ich Rückwärts gelaufen.

Sie können alle drei folgenden Einstellungen über das Exchange Admin Center durchführen.

Retentiontag anlegen

Im Bereich "Compliance" addiere ich zuerst das gewünschte "Aufbewahrungstag":

In meinem Fall möchte ich die Mails nach 30 Tagen löschen:

Den neuen Eintrag speichere ich. In der PowerShell sieht er wie folgt aus:

[PS] C:\>Get-RetentionPolicyTag "MailboxDeleteTag" | fl

MessageClassDisplayName               : All Mailbox Content
MessageClass                          : *
Description                           : Managed Content Settings
RetentionEnabled                      : True
RetentionAction                       : PermanentlyDelete
AgeLimitForRetention                  : 30.00:00:00
TriggerForRetention                   : WhenDelivered
MessageFormatForJournaling            : UseTnef
JournalingEnabled                     : False
AddressForJournaling                  :
LabelForJournaling                    :
Type                                  : All
IsDefaultAutoGroupPolicyTag           : False
IsDefaultModeratedRecipientsPolicyTag : False
SystemTag                             : False
LocalizedRetentionPolicyTagName       : {}
Name                                  : MailboxDeleteTag
DistinguishedName                     : CN=MailboxDeleteTg,CN=Retention Policy Tag
                                        Container,CN=ExOrg,CN=Microsoft
                                        Exchange,CN=Services,CN=Configuration,DC=msxfaq,DC=net
Identity                              : MailboxDeleteTag
Id                                    : MailboxDeleteTag

Achten Sie darauf, dass "RetentionEnabled = $true" und RetentionEnabled = $True" ist.

The MoveToDeletedItems and MoveToFolder actions are available, but don't work. These actions are available for upgrades from messaging records management (MRM) 1.0 (managed folders) to MRM 2.0 (retention policies). MRM 2.0 was introduced in Exchange 2010 Service Pack 1 (SP1).
Quelle: https://learn.microsoft.com/en-us/powershell/module/exchange/new-retentionpolicytag?view=exchange-ps&redirectedfrom=MSDN#-retentionaction

Retention Policy anlegen

Nun gehe ich den Bereich "Aufbewahrungsrichtlinien" und addiere neben der vorhandenen "Default MDM Policy" eine neue Richtlinie für meine Löschfunktion:

Ich vergebe einen Namen und addiere das kurz vorher angelegte Aufbewahrungstag:

Auch diese Einstellung wird gespeichert und in der PowerShell gibt es keine weiteren Schalter.

[PS] C:\>Get-RetentionPolicy "DeleteMailbox30Day" | fl

RetentionId                 : 02a4f6ef-4e52-4e57-8884-9df7a9a330a9
RetentionPolicyTagLinks     : {MailboxDeleteTag}
IsDefault                   : False
IsDefaultArbitrationMailbox : False
Name                        : DeleteMailbox30Day
DistinguishedName           : CN=Delete 90 Day Mailbox,CN=Retention Policies Container,CN=ExOrg,CN=Microsoft
                              Exchange,CN=Services,CN=Configuration,DC=msxfaq,DC=net
Identity                    : Delete 90 Day Mailbox
Guid                        : 02a4f6ef-4e52-4e57-8884-9df7a9a330a9
Id                          : DeleteMailbox30Day

Retention Policy zuweisen

Im dritten Schritt weise ich die neue Aufbewahrungsrichtlinie dem Postfach "PSReport" zu.

Auch hier kontrolliere ich das Postfach, dass die Richtlinie zugewiesen und ELC nicht deaktiviert ist.

[PS] C:\>get-mailbox PSReport | fl retentionpolicy,ElcProcessingDisabled

RetentionPolicy       : DeleteMailbox30Day
ElcProcessingDisabled : False

Nun gilt es etwas Geduld zu haben. Die Eintragungen der Aufbewahrungstags, Aufbewahrungsrichtlinien und die Verbindung zum Postfach landen alle im Active Directory und sind damit in der Regel in wenigen Minuten repliziert. Aber die Anwendung der neuen Einstellungen ist ein Hintergrundprozess.

Default MRM Policy

zum Vergleich dokumentiere ich hier noch einmal die Exchange 2019 Standard MRM Policy, welches einige persönliche Tags vorgibt. Sie gilt für alle Postfächer, die keine abweichende Policy haben.

Exchange Setup creates the retention policy Default MRM Policy. The policy is applied automatically if you create an archive for the new user and don't specify a retention policy
https://learn.microsoft.com/en-us/exchange/policy-and-compliance/mrm/retention-tags-and-retention-policies?#default-retention-policy

Sie legt z.B. auch die Archivierung auf zwei Jahre fest, wenn ihr Postfach auch ein Archivpostfach hat.

Interessant ist das PolicyTag "Recoverable Items 14 days move to archive", welches hier enthalten aber nicht als "Policytag definiert ist.

Start-ManagedFolderAssistant

Geduld ist natürlich eine Tugend, die speziell IT-Administratoren nicht haben. Wir wollen immer sofort Ergebnisse sehen. Die Funktion diese Aufbewahrungsrichtlinien auf Elemente in Postfächern zuzuweisen und Löschungen und Archivierungen auszuführen, ist eine Aufgabe des Exchange Mailbox Assistant Service (MSExchangeMailboxAssistants), der als eigene Dienst auf jedem Exchange Server vorhanden ist.

Bei Exchange 2007/2010 (Siehe MRM Message Records Management) gab es noch einen Zeitplan, über den Sie die Aktivität steuern konnten. Mittlerweile läuft der Assistent rund um die Uhr und passt seine Aktivität an die Systemauslastung an. In Exchange Online gibt es diesen Prozess natürlich auch.

Wenn Sie Exchange einen Hinweis geben möchten, dass Sie bei einem Postfach die Retention Policy oder Retention Tags geändert haben und er bitte möglichst schnell das Postfach bearbeiten soll, dann können Sie dies per PowerShell anstoßen.

Start-ManagedFolderAssistant <MailboxID>

Wer die Dokumentation zu "Start-ManagedFolderAssistant" liest, findet einige weitere Parameter, die meine Aufmerksamkeit auf sich gezogen habe.

-AggMailboxCleanup
The AggMailboxCleanup switch specifies a more aggressive processing cycle if items aren't moving as quickly as they should. You don't need to specify a value with this switch
Quelle: https://learn.microsoft.com/en-us/powershell/module/exchange/start-managedfolderassistant?view=exchange-ps#-aggmailboxcleanup

Sollte man damit den Agenten anweisen können, etwas mehr zügiger zu arbeiten? Ich kann den Befehl ausführen aber auf den ersten Blick ist erst einmal kein Unterschied zu erkennen.

Start-ManagedFolderAssistant <MailboxID> -AggMailboxCleanup

Das Commandlet kommt genauso schnell wieder zurück und ich konnte keine Veränderung am AD-Objekt oder sonst wo direkt erkennen. Eine direkte Kommunikation zum Dienst ist auch nicht zu erkennen, zumal, es auch keinen Fehler gibt, wenn die Dienste "MSExchangeMailboxAssistants" oder "MSExchangeServiceHost" gestoppt sind. Dort hätte ich den Hintergrunddienst verortet.

Vermutlich setzt das Commandlet auch nur einen Marker im Postfach selbst

Erwarten Sie aber nicht, dass der Exchange Mailbox Assistant nun sofort losstürmt.

Ich habe leider noch keine weitere Analysen anstellen können, wie das Commandlet mit dem Server spricht und wo man Einblick in die Warteschlange nehmen könnte. Es wird zumindest kein Flag am AD-Objekt gesetzt.

Status des Postfachs

Wann der Prozess das letzte Mal ein Postfach bearbeitet hat, können Sie per PowerShell etwas umständlich auslesen. Am Beispiel "PSREPORT" liefert mit der Befehl folgende Ausgabe:

([xml]((Export-MailboxDiagnosticLogs `
           -Identity psreport  `
           -ExtendedProperties `
        ).MailboxLog `
      ) `
).properties.MailboxTable.Property `
| where {$_.name -like "Elc*"}

Name                                    Value
----                                    -----
ElcLastRunTotalProcessingTime           8390
ElcLastRunSubAssistantProcessingTime    6505
ElcLastRunUpdatedFolderCount            8
ElcLastRunTaggedFolderCount             0
ElcLastRunUpdatedItemCount              0
ElcLastRunTaggedWithArchiveItemCount    0
ElcLastRunTaggedWithExpiryItemCount     0
ElcLastRunDeletedFromRootItemCount      1999
ElcLastRunDeletedFromDumpsterItemCount  0
ElcLastRunArchivedFromRootItemCount     0
ElcLastRunArchivedFromDumpsterItemCount 0
ELCLastSuccessTimestamp                 11/21/2023 2:48:58 PM
ElcFaiSaveStatus                        SaveSucceeded
ElcFaiDeleteStatus                      DeleteNotAttempted

Interessanterweise hat ein "Start-ManagedFolderAssistant <MailboxID>" sehr schnell zu einem Update von "ELCLastSuccessTimestamp" geführt.

Die Ermittlung dieser Wert ist natürlich alles andere als intuitiv, Wie sie am PowerShell-Kommando schon sehen können

  • Mit "Export-MailboxDiagnosticLogs -ExtendedProperties" bekommen Sie ein Objekt
    Ich vermute, dass hier das Kommando einfach ein verstecktes Objekte aus dem Postfach lädt, in welches die Exchange Dienste protokollieren. Das kennen wir ja auch schon beim MoveRequest.
  • Das Property "Mailboxlog" enthält mehr Details als XML-Information
    Allerdings gibt es sonst nicht viel weitere interessante Properties.
  • Casting/Parsen als XML-Objekt
    Interessant ist der XML-Knoten "properties.MailboxTable.Property"
  • Das Ergebnis ist ein Array mit jeweils einem Objekt mit den Namen "Name" und "Value"
    Es ist also keine Hashtable oder Objekt zum direkten Zugriffe
    in ein XML-Objekt überführen, damit

Damit finden wir zumindest, ob und wann der Assistent das letzte Mal das Postfach bearbeitet hat.

Nicht immer schafft es Exchange, alle Postfächer innerhalb von 24h abzuarbeiten.
Der Archiv-Prozess überspringt pauschal alle Postfächer, deren Postfachgröße unter 10 Megabyte liegt.
Postfächer mit InPlaceHold werden ebenfalls ignoriert. (Get-OrganizationConfig | Select-Object -ExpandProperty InPlaceHolds)
Elemente in Postfächern mit Retention Hold werden nicht gelöscht
Elemente in Postfächern mit InplaceHold oder Litigation Hold werden gelöscht aber in "Recoverable Items" gehalten

In Exchange Online können bis zu 7 Tage vergehen, ehe der Prozess ein Postfach verarbeitet

Es gibt von Microsoft sogar ein Tool zur Analyse der MRM-Konfigurationen.

Get-MRMDetails.ps1
https://microsoft.github.io/CSS-Exchange/Retention/Get-MRMDetails/ 
https://github.com/microsoft/CSS-Exchange/releases/latest/download/Get-MRMDetails.ps1

Postfachstatistik

Mit den ausreichenden Berechtigungen können Sie natürlich auch per Exchange PowerShell zumindest die Statistiken zum Postfach und dessen Ordner anzeigen. Dazu ist einmal die Postfachgröße und Elementanzahl interessant:

PS] C:\>Get-MailboxStatistics -Identity psreport | fl displayname,MailboxTypeDetail,totalitemsize,itemcount

DisplayName       : PowerShellReport
MailboxTypeDetail : SharedrMailbox
TotalItemSize     : 5,369 GB (5,765,454,422 bytes)
ItemCount         : 428321

Noch detaillierter ist natürlich der Blick mit "Get-MailboxFolderStatistics".

PS] C:\>Get-MailboxFolderStatistics PSReport -IncludeOldestAndNewestItems | ft identity,Foldertype,ItemsInFolder,Foldersize,OldestItemReceivedDate

Identity                                            FolderType                ItemsInFolder FolderSize               OldestItemReceivedDate
--------                                            ----------                ------------- ----------               ----------------------
PSReport\Oberste Ebene des Informationsspeichers    Root                                  0 0 B (0 bytes)
PSReport\Aufgaben                                   Tasks                                 0 0 B (0 bytes)
PSReport\Aufgezeichnete Unterhaltungen              User Created                          0 0 B (0 bytes)
PSReport\Conversation Action Settings               ConversationActions                   0 0 B (0 bytes)
PSReport\Dateien                                    Files                                 0 0 B (0 bytes)
PSReport\Entwürfe                                   Drafts                                0 0 B (0 bytes)
PSReport\ExternalContacts                           ExternalContacts                      0 0 B (0 bytes)
PSReport\Gelöschte Elemente                         DeletedItems                         11 32.68 KB (33,462 bytes)  02.02.2023 17:23:48
PSReport\Gesendete Elemente                         SentItems                             0 0 B (0 bytes)
PSReport\Journal                                    Journal                               0 0 B (0 bytes)
PSReport\Junk-E-Mail                                JunkEmail                             0 0 B (0 bytes)
PSReport\Kalender                                   Calendar                              2 5.798 KB (5,937 bytes)
PSReport\Kontakte                                   Contacts                              0 0 B (0 bytes)
PSReport\Notizen                                    Notes                                 0 0 B (0 bytes)
PSReport\Postausgang                                Outbox                                0 0 B (0 bytes)
PSReport\Posteingang                                Inbox                            428270 5.369 GB (5,765,454,422 bytes)
PSReport\Working Set                                WorkingSet                            0 0 B (0 bytes)
PSReport\Recoverable Items                          RecoverableItemsRoot                  0 0 B (0 bytes)
PSReport\Calendar Logging                           CalendarLogging                       0 0 B (0 bytes)
PSReport\Deletions                                  RecoverableItemsDeletions            39 697.7 KB (714,441 bytes) 07.06.2013 20:51:00
PSReport\Purges                                     RecoverableItemsPurges                0 0 B (0 bytes)
PSReport\Versions                                   RecoverableItemsVersions              0 0 B (0 bytes)

Über die Option "-IncludeOldestAndNewestItems" ermittelt die PowerShell auch das älteste Objekt, was natürlich hilfreich ist, wenn Sie eine Richtlinie zum Löschen alter Objekte überprüfen wollen

Export-MailboxDiagnosticLogs

Ich war relativ sicher dass ich alles richtig eingestellt habe aber dennoch wurden die Mails im Postfach nicht bereinigt. Über das Commandlet "Export-MailboxDiagnosticLogs" kann man mit dem richtigen Parameter weitere Details entlocken:

[PS] C:\>Export-MailboxDiagnosticLogs PSReport -ComponentName MRM

MailboxLog  : 11/24/2023 7:27:57 PM Exception: Microsoft.Exchange.WorkloadManagement.ResourceUnhealthyException:
              Resource 'DiskLatency(Guid:900c3b74-fae4-431c-9f77-3dfd70087bac Name:DB01
              Volume:\\?\Volume{2af56ad6-057d-4dd5-a180-b3155306d3cc}\)' is unhealthy and shouldn't be accessed.
                 at
              Microsoft.Exchange.MailboxAssistants.Assistants.ELC.ELCHealthMonitor.InternalThrottleStoreCall(List`1
              archiveResourceDependencies)
                 at Microsoft.Exchange.MailboxAssistants.Assistants.ELC.DumpsterExpirationEnforcer.ProcessFolderContent
              s(Folder folder, DefaultFolderType folderTypeToCollect, ItemQueryType itemQueryType, AgeLimitAndAction
              ageLimitAndAction)
                 at Microsoft.Exchange.MailboxAssistants.Assistants.ELC.DumpsterExpirationEnforcer.ProcessFolderType(De
              faultFolderType defaultFolderType, AgeLimitAndAction ageLimitAndAction)
                 at
              Microsoft.Exchange.MailboxAssistants.Assistants.ELC.DumpsterExpirationEnforcer.CollectItemsToExpire()
                 at Microsoft.Exchange.MailboxAssistants.Assistants.ELC.SysCleanupEnforcerBase.CollectItemsWithGuard()
                 at Microsoft.Exchange.MailboxAssistants.Assistants.ELC.SysCleanupEnforcerBase.InvokeInternal()
                 at Microsoft.Exchange.MailboxAssistants.Assistants.ELC.SysCleanupEnforcerBase.Invoke()
                 at
              Microsoft.Exchange.MailboxAssistants.Assistants.ELC.SysCleanupEnforcerManager.Invoke(MailboxDataForTags
              mailboxDataForTags, ElcParameters parameters)
                 at Microsoft.Exchange.MailboxAssistants.Assistants.ELC.SysCleanupSubAssistant.Invoke(MailboxSession
              mailboxSession, MailboxDataForTags mailboxDataForTags, ElcParameters parameters)
                 at Microsoft.Exchange.MailboxAssistants.Assistants.ELC.ELCAssistant.InvokeCore(MailboxSession
              mailboxSession, List`1 customDataToLog, StatisticsLogEntry logEntry, ElcParameters parameters)
                 at Microsoft.Exchange.MailboxAssistants.Assistants.ELC.ELCAssistant.<>c__DisplayClass30_0.<InvokeInter
              nalAssistant>b__0()
                 at Microsoft.Exchange.Common.IL.ILUtil.DoTryFilterCatch(Action tryDelegate, Func`2 filterDelegate,
              Action`1 catchDelegate)
LogName     : MRM
Identity    : msxfaq.net/Users/PSReport
IsValid     : True
ObjectState : Unchanged

Und hier ist gut zu sehen, dass im Moment wohl die Festplatte DB01 zu langsam ist (Disklatency) und daher der MRM nicht aktiv wird. Da heißt es warten oder den MRM zu einer anderen Zeit noch einmal starten wenn die Datenbank nicht gerade z.B. eine Datensicherung oder größere MoveRequests zu bedienen hat.

Hinweis:
Das Protokoll enthält immer die letzten Fehler. Wenn es keine neuen Fehler gibt, wird das Log aber nicht gelöscht. Prüfen Sie daher das Datum, ob die Meldungen noch zutreffend sind.

Wenn Sie absichtlich einen falschen Wert bei "ComponentName" angeben, dann liefert die Exchange 2016 PowerShell in der Fehlermeldung auch die möglichen gültigen Komponenten für weitere Details.

[PS] C:\>Export-MailboxDiagnosticLogs PSReport -ComponentName invalid
Logs for component 'MR2' weren't found in mailbox 'PSReport'. Available logs: 'MRM, ClearCalendar, OOFRules,
InternalCalendarSharingMigration, BirthdayAssistant, RemindersAssistant, CalendarPermissions, OOF,
SharingSyncAssistant,HoldTracking'
MRM
ClearCalendar
OOFRules,
InternalCalendarSharingMigration
BirthdayAssistant
RemindersAssistant
CalendarPermissions
OOF
SharingSyncAssistant
HoldTracking

In Exchange Online gibt es noch andere Komponenten:

Fehleranalyse OnPremises Dateien

Wenn Sie ihre Server selbst betreiben, dann wird es nun etwas kniffliger. Wenn Sie nur genau einen Server haben, dann haben Sie schon einmal einen Ansatzpunkt im Eventlog oder ggfls. Tracing. Bei mehreren Servern stellt sich zuerst die Frage, welcher Server denn die Funktion für eine Postfach ausführt. Zuerst hat mich folgender Eventlogeintrag auf das Exchange Logging im Dateisystem hingewiesen.

Log Name:      Microsoft-Exchange-MailboxAssistants/Operational
Source:        Microsoft-Exchange-MailboxAssistants
Event ID:      2
Task Category: Discovery Operation
Level:         Information
User:          SYSTEM
Description:
End assistants loader for process MSExchangeMailboxAssistants, 
  provider search path C:\Program Files\Microsoft\Exchange Server\V15\Bin, 
  log path C:\Program Files\Microsoft\Exchange Server\V15\Logging.

Dort landen schon sehr viele CSV-Dateien Hier ein Auszug mit dem Header und das Feld "CustomData" habe ich umgebrochen.

#Software: Microsoft Exchange
#Version: 15.0.0.0
#Log-type: ELC Mailbox Assistants Log
#<Date: 2023-10-26T12:05:36.103Z
#Fields: Timestamp,ServerName,Location,AssistantName,ActivityId,TargetObject,Event,CustomData
2023-10-26T12:05:36.103Z,EX2019,DB01,ElcAssistant,,b9d300de-6890-4692-a1f4-5b66014b4d2e,EndProcessingMailbox,
  "S:SLADays=0.999936766349537;S:SLAStatus=True;S:ProcessingStartTime=2023-10-26T12:05:36;
  S:ProcessingEndTime=2023-10-26T12:05:36;S:OrganizationName=;S:ExternalDirectoryOrganizationId=;
  S:MailboxGuid=b9d300de-6890-4692-a1f4-5b66014b4d2e;S:LastSuccessDate=2023-10-25T12:05:41;
  S:RecipientTypeDetails=1;S:IsArchive=False;S:IsArchiveOverWarningQuota=False;
  S:IsArchiveMailboxFull=False;S:IsArchiveDumpsterFull=False;S:IsOnDemandJob=False;
  S:IsFullCrawlNeeded=False;S:WasComplianceTagHoldApplied=False;S:WasPersonalDeleteTagApplied=False;
  S:WasPersonalArchiveTagApplied=False;S:IsGroupMailbox=False;S:IsLitigationHoldEnabled=False;
  S:IsInPlaceHoldEnabled=False;S:IDHA=False;S:DHRP=0;S:IsAuditEnabled=False;S:TotalProcessingTime=78;
  S:TagSubAssistantProcessingTime=2;S:FolderSubAssistantProcessingTime=0;
  S:CleanupSubAssistantProcessingTime=59;S:TagProvisionerProcessingTime=0;
  S:TagEnforcerProcessingTime=0;S:DumpsterExpirationEnforcerProcessingTime=9;
  S:CalendarLogExpirationEnforcerProcessingTime=1;S:AuditExpirationEnforcerProcessingTime=6;
  S:DumpsterQuotaEnforcerProcessingTime=0;S:DiscoveryHoldEnforcerProcessingTime=0;
  S:SupplementExpirationEnforcerProcessingTime=13;S:EHAHiddenFolderCleanupEnforcerProcessingTime=0;
  S:MigrateToArchiveEnforcerProcessingTime=0;S:EHAMigratedMessageMoveEnforcerProcessingTime=0;
  S:EHAMigratedMessageDeletionEnforcerProcessingTime=0;S:HoldCleanupEnforcerProcessingTime=0;
  S:AggMailboxCleanupEnforcerProcessingTime=0;S:NumberOfFoldersUpdated=0;
  S:NumberOfFoldersTaggedByPersonalArchiveTag=0;S:NumberOfFoldersTaggedByPersonalExpiryTag=0;
  S:NumberOfFoldersTaggedBySystemExpiryTag=0;S:NumberOfFoldersTaggedByUncertaionExpiryTag=0;
  S:NumberOfItemsUpdated=0;S:NumberOfItemsTaggedByPersonalArchiveTag=0;
  S:NumberOfItemsTaggedByPersonalExpiryTag=0;S:NumberOfItemsTaggedByDefaultExpiryTag=0;
  S:NumberOfItemsTaggedBySystemExpiryTag=0;S:NumberOfItemsTaggedByUncertaionExpiryTag=0;
  S:NumberOfItemsDeletedByPersonalTag=0;S:NumberOfItemsDeletedByDefaultTag=0;
  S:NumberOfItemsDeletedBySystemTag=0;S:NumberOfItemsActuallyDeletedByTag=0;
  S:NumberOfItemsArchivedByPersonalTag=0;S:NumberOfItemsArchivedByDefaultTag=0;
  S:NumberOfItemsActuallyArchivedByTag=0;S:NumberOfItemsDeletedByDumpsterExpirationEnforcer=0;
  S:NumberOfItemsActuallyDeletedByDumpsterExpirationEnforcer=0;
  S:NumberOfItemsArchivedByDumpsterExpirationEnforcer=0;
  S:NumberOfItemsActuallyArchivedByDumpsterExpirationEnforcer=0;
  S:NumberOfItemsMovedToPurgesByDumpsterExpirationEnforcer=0;
  S:NumberOfItemsActuallyMovedToPurgesByDumpsterExpirationEnforcer=0;
  S:NumberOfItemsDeletedByAuditExpirationEnforcer=0;S:NumberOfItemsDeletedByCalendarLogExpirationEnforcer=0;
  S:NumberOfItemsDeletedByDumpsterQuotaEnforcer=0;S:NumberOfItemsActuallyDeletedByDumpsterQuotaEnforcer=0;
  S:NumberOfItemsDeletedBySupplementExpirationEnforcer=0;S:NumberOfItemsDeletedByDiscoveryHoldEnforcer=0;
  S:NumberOfItemsActuallyDeletedByDiscoveryHoldEnforcer=0;S:NumberOfItemsMovedByMigrateToArchiveEnforcer=0;
  S:NumberOfMigratedItemsDeletedDueToMigrationExpiryDate=0;S:NumberOfMigratedItemsMovedDueToMigrationExpiryDate=0;
  S:NumberOfItemsInDiscoveryHoldFolderBeforeProcessing=0;S:SizeOfDeletionByDiscoveryHoldEnforcer=0;
  S:DiscoveryHoldFolderSizeBeforeProcessing=0;S:EhaMigrationMessageCount=0;
  S:NumberOfItemsDeletedFromInboxByEHAHiddenFolderCleanupEnforcer=0;
  S:NumberOfItemsDeletedFromSentByEHAHiddenFolderCleanupEnforcer=0;
  S:NumberOfItemsDeterminedDuplicateByHoldCleanupEnforcer=0;
  S:SizeOfItemsDeterminedDuplicateByHoldCleanupEnforcer=0;
  S:NumberOfItemsAnalyzedByHoldCleanupEnforcer=0;
  S:NumberOfItemsSkippedByHoldCleanupEnforcer=0;
  S:NumberOfBatchesFailedToExpireInExpirationExecutor=0;
  S:NumberOfBatchesFailedToMoveInArchiveProcessor=0;
  S:NumberOfItemsSkippedDueToSizeRestrictionInArchiveProcessor=0;
  S:ExceptionType=;S:LogExceptionType=;S:RetryCount=1;S:FRA=False;S:ESR=Completed;S:DeletionAgeLimit=28.00:00:00;
  S:LastProcessedEnforcer=SignalFolderExpirationEnforcer;S:MoveToArchiveLimitReached=False;
  S:FailedToLoadUnifiedPolicies=;S:FailedToLoadHoldCacheEntries=;S:FailedToLoadComplianceServiceHoldCacheEntries=;
  S:NumberOfHoldCacheEntriesRetrieved=0;S:NumberOfHoldCacheEntriesUpdated=0;S:NumberOfHoldCacheEntriesDeleted=0;
  S:HoldCacheValidationStatus=;S:IHCSCF=False;S:AdminAuditRecordAgeLimit=;
  S:MailboxAuditRecordAgeLimit=;S:OldestExpiringAuditLog=1/1/0001 12:00:00 AM;S:IsAdminAuditLog=False;
  S:ArchiveProcessor=;S:IsInactiveMailbox=False;S:FaiSaveStatus=SaveNotAttempted;S:FaiDeleteStatus=DeleteNotAttempted;
  S:IsDiscoveryHoldQueryCacheRefreshed=False;S:DiscoveryHoldQueryCacheRefreshIntervalInMinutes=240;
  S:StaleHoldEntryFound=False;S:StaleComplianceServiceHoldEntryFound=False;S:IsAzureHoldCache=False;
  S:IsComplianceServiceHoldCache=False;S:NumberOfGhostedFolderProcessed=0;S:NumberOfGhostedFolderEmptied=0;
  S:NumberOfGhostedDumpsterFolderEmptied=0;S:NumberOfGhostedFolderItemsDeleted=0;
  S:NumberOfGhostedFolderUntagged=0;S:NumberOfGhostedFolderItemsUntagged=0;S:NumberOfInvalidGhostedFolder=0;
  S:GhostedFolderRetentionPeriodInDays=60;S:IsHierarchySyncTriggered=False;S:FolderSplitThreshold=;
  S:IsFolderSplitTriggered=False;S:StartingStateOfFolderSplit=;
  S:FolderSplitTargetMailboxGuid=00000000-0000-0000-0000-000000000000;
  S:NumberOfFoldersMoved=0;S:SizeOfFoldersMoved=;S:ConvertToLargeArchive=False;
  S:MailboxType=Primary;S:NumberOfAuxMailboxes=0;S:NumberOfItemsMovedFromDefaultDumpsterFolders=0;
  S:DisplayNameOfFolderSplited=;S:NumberOfFoldersSplitedOut=0;S:NumberOfDumpsterFoldersSplitedOut=0;
  S:NumberOfItemsMovedInSingleFolderSplit=0;S:IsLastSplitCompleted=False;
  S:IgnoreDeletedItemsTag=False;S:IsCloudArchive=False;S:HasPolicy=False;
  S:HasCustomPolicy=False;S:PolicyName=;S:HasDefaultDeleteAllTag=False;S:DefaultDeleteAllTagPeriod=0;
  S:HasDefaultDeleteVMTag=False;S:DefaultDeleteVMTagPeriod=0;
  S:HasDefaultDeleteSkypeTag=False;S:DefaultDeleteSkypeTagPeriod=0;S:HasPersonalDeleteTag=False;
  S:HasPersonalArchiveTag=False;S:HasCustomSystemTag=False;
  S:NumberOfItemsDeletedByDefaultDeletedItemsTag=0;S:NumberOfEmptyRetentionIdFound=0;
  S:NumberOfEmptyRetentionIdFixed=0;
  S:IncreasedDumpsterQuota=False;S:LastSecureFolderProcessed=;
  S:NumberOfALItemsPastRetention=0;S:NumberOfALItemsExpiredByRetention=0;S:NumberOfALItemsOverMaxLimit=0;
  S:NumberOfALItemsOverSafeLimit=0;S:NumberOfALItemsExpiredByFolderShapeLimits=0;
  S:NumberOfALItemsDeletedBySDFExpirationEnforcer=0;
  S:NumberOfExpiredItemsTagUpdated=0;S:ALItemCountBeforeProcessing=0;
  S:ALFolderSizeBeforeProcessing=0;S:ALFolderSizeAfterProcessing=0;S:ALFolderRetentionExitCode=;
  S:ALFolderShapeLimitExitCode=;S:SDFExpirationEnforcerProcessingTime=0;
  S:NumberOfCMItemsPastRetention=0;S:NumberOfCMItemsExpiredByRetention=0;
  S:NumberOfCMItemsOverMaxLimit=0;S:NumberOfCMItemsOverSafeLimit=0;
  S:NumberOfCMItemsExpiredByFolderShapeLimits=0;S:NumberOfCMItemsDeletedBySDFExpirationEnforcer=0;
  S:CMItemCountBeforeProcessing=0;S:CHFolderSizeBeforeProcessing=0;
  S:CHFolderSizeAfterProcessing=0;S:CHFolderRetentionExitCode=;S:CHFolderShapeLimitExitCode=;
  S:NumberOfSNItemsPastRetention=0;S:NumberOfSNItemsExpiredByRetention=0;
  S:NumberOfSNItemsOverMaxLimit=0;S:NumberOfSNItemsOverSafeLimit=0;
  S:NumberOfSNItemsExpiredByFolderShapeLimits=0;S:NumberOfSNItemsDeletedBySDFExpirationEnforcer=0;
  S:SNItemCountBeforeProcessing=0;S:SNFolderSizeBeforeProcessing=0;
  S:SNFolderSizeAfterProcessing=0;S:SNFolderRetentionExitCode=;
  S:SNFolderShapeLimitExitCode=;S:NumberOfPaceItemsPastRetention=0;
  S:NumberOfPaceItemsExpiredByRetention=0;S:NumberOfPaceItemsOverMaxLimit=0;
  S:NumberOfPaceItemsOverSafeLimit=0;S:NumberOfPaceItemsExpiredByFolderShapeLimits=0;
  S:NumberOfPaceItemsDeletedBySDFExpirationEnforcer=0;S:PaceItemCountBeforeProcessing=0;
  S:PaceFolderSizeBeforeProcessing=0;S:PaceFolderSizeAfterProcessing=0;
  S:PaceFolderRetentionExitCode=;S:PaceFolderShapeLimitExitCode=;
  S:NumberOfDelveNotificationsPastRetention=0;S:NumberOfDelveNotificationsExpiredByRetention=0;
  S:NumberOfDelveNotificationsOverMaxLimit=0;S:NumberOfDelveNotificationsOverSafeLimit=0;
  S:NumberOfDelveNotificationsExpiredByFolderShapeLimits=0;
  S:NumberOfDelveNotificationsDeletedBySDFExpirationEnforcer=0;
  S:DelveNotificationItemCountBeforeProcessing=0;S:DelveNotificationFolderSizeBeforeProcessing=0;
  S:DelveNotificationFolderSizeAfterProcessing=0;S:DelveNotificationFolderRetentionExitCode=;
  S:DelveNotificationFolderShapeLimitExitCode=;S:NumberOfGraphDraftsPastRetention=0;
  S:NumberOfGraphDraftsExpiredByRetention=0;S:NumberOfGraphDraftsOverMaxLimit=0;
  S:NumberOfGraphDraftsOverSafeLimit=0;S:NumberOfGraphDraftsExpiredByFolderShapeLimits=0;
  S:NumberOfItemsDeletedByGraphDraftsExpirationEnforcer=0;
  S:GraphDraftsCountBeforeProcessing=0;S:GraphDraftsFolderSizeBeforeProcessing=0;
  S:GraphDraftsFolderSizeAfterProcessing=0;S:GraphDraftsFolderRetentionExitCode=;
  S:GraphDraftsFolderShapeLimitExitCode=;S:NumberOfGraphTransactionsPastRetention=0;
  S:NumberOfGraphTransactionsExpiredByRetention=0;S:NumberOfGraphTransactionsOverMaxLimit=0;
  S:NumberOfGraphTransactionsOverSafeLimit=0;S:NumberOfGraphTransactionsExpiredByFolderShapeLimits=0;
  S:NumberOfItemsDeletedByGraphTransactionsExpirationEnforcer=0;S:GraphTransactionsCountBeforeProcessing=0;
  S:GraphTransactionsFolderSizeBeforeProcessing=0;S:GraphTransactionsFolderSizeAfterProcessing=0;
  S:GraphTransactionsFolderRetentionExitCode=;S:GraphTransactionsFolderShapeLimitExitCode=;
  S:NumberOfAggMailboxDelOperationsRetrieved=Total:0,DeleteMessage:0,DeleteConv:0,DeleteGroup:0,DeleteMessageByCapacity:0;
  S:NumberOfAggMailboxDelOperationsCompleted=0;S:NumberOfAggMailboxDelOperationsPartiallyDone=0;
  S:NumberOfAggMailboxDelOperationsWithSoftFailure=0;
  S:NumberOfAggMailboxDelOperationsWithPermFailure=0;S:NumberOfAggMailboxDelItemsCollected=0;
  S:AggMailboxDelItemsErrors=;S:NumberOfItemsDeletedByDefaultFolderHistoryExpirationEnforcer=0;
  S:DefaultFolderHistoryExpirationEnforcerProcessingTime=10;
  S:MergeRequestIdentity=;S:MergeRequestTargetMailbox=00000000-0000-0000-0000-000000000000;
  S:MergeRequestStatus=;
  S:MergeRequestFolders=;S:ExistingMergeRequestIdentity=;
  S:ExistingMergeRequestStatus=;S:TotalNonIpmSize=0;
  S:TotalDumpsterSize=0;S:TotalGhostedFolderSize=0;S:AuxToMainArchiveTotalSizeRatio=0;S:ExistingMoveFailedExType=;
  S:ExistingMoveFailedExMessage=;S:NumberOfItemsDeletedByODataSyncStateExpirationEnforcer=0;
  S:ODataSyncStateExpirationEnforcerProcessingTime=0;
  S:QT=;S:QBTPPT=0;S:QBTIT=0;S:EBTIP=0;S:EBTIF=0;S:EBTPT=0;
  S:REE=0;S:REEPT=0;S:PurgedItemCountInReviewMbx=0;
  S:DiscHoldItemCountInReviewMbx=0;S:HardDeletedItemCountInReviewMbx=0;
  S:SRExpirationEnforcerProcessingTime=0;
  S:NITBMONIF=0;S:NIAMONIF=0;S:MTABIC=0;S:SUT=;S:SUTPPT=0;S:SIU=0;
  S:HPM=False;S:SDHP=False;S:LVH=;S:NOVH=0;S:CQL=0;S:EEIC=0;S:EEIS=0;S:EX="

Die Mailbox ist im Feld "TargetObject" für die ExchangeGUID zu erkennen. Ich habe daher auf die Mailbox "PSReport" wie folgt gefiltert und konnte gut sehen, dass der Zugriff ca. alle 24h erfolgt.

$mbguid = (get-mailbox psreport).ExchangeGUID.GUID

Get-Item -path "C:\Program Files\Microsoft\Exchange Server\V15\Logging\MailboxAssistantsLog\ELCMailboxAssistants*.LOG" `
| %{import-csv `
       -Path $_.fullname `
       -Header Timestamp,ServerName,Location,AssistantName,ActivityId,TargetObject,Event,CustomData`
   } `
| ?{$_.targetobject -eq $mbguid}`
| ft timestamp

Timestamp
---------
2023-10-27T15:17:41.790Z
2023-10-28T15:17:39.706Z
2023-10-29T15:17:38.808Z
2023-10-30T15:19:30.120Z
2023-10-31T15:19:30.031Z
2023-11-01T15:13:49.852Z
2023-11-02T15:13:46.241Z
2023-11-03T15:19:24.647Z
2023-11-04T15:13:47.334Z
2023-11-05T15:19:23.330Z
2023-11-06T15:19:22.995Z
2023-11-07T15:27:50.006Z
2023-11-08T15:29:29.340Z
2023-11-09T15:29:23.656Z
2023-11-10T15:29:25.509Z
....

Ich habe auch nur auf dem Server eine Ausgabe erhalten, auf der die Datenbank auch aktiv ist.

Ich würde daher davon ausgehen, dass für ein Postfach immer der Server zuständig ist, auf dem die Datenbank gemountet ist.

In Exchange Online sind bis zu 7 Tage möglich:

In Exchange Online, the Managed Folder Assistant (MFA) is set to process mailboxes at least one time every seven days. Although MFA usually processes mailboxes every day, the process can take up to seven days to finish. Instead of waiting for the process to run, you can force it by running the Start-ManagedFolderAssistant  cmdlet.
https://learn.microsoft.com/en-us/microsoft-365/troubleshoot/retention/troubleshoot-mrm-email-archive-deletion 

Eine weitere Auswertung des Logs nach "Location" hat auch immer nur die Datenbanken gezeigt, die zu dem Zeitpunkt auf dem gemountet sind. Im Feld "AssistantName" ist immer nur "ElcAssistant" erschienen und bei Event stand immer nur "EndProcessingMailbox".

Dafür habe ich ein anderes Log gefunden, welches zumindest den Start und das Ende eines Laufs anzeigt und erkennen lässt, ob es ein "geplanter" oder ein "onDemand"-Aufruf war

C:\Program Files\Microsoft\Exchange Server\V15\Logging\MailboxAssistantsSlaReportLog\ElcAssistant*.LOG

Der Inhalt ist wieder im klassischen LogFormat und zur Lesbarkeit habe ich die Zeile nach jedem Feld umgebrochen

#Software: Microsoft Exchange
#Version: 15.0.0.0
#Log-type: MailboxAssistantsSlaReportLog
#Date: 2023-11-25T18:00:36.604Z
#Fields: Timestamp,ServerName,AssistantName,Database,JobId,RequestType,MailboxGuid,Event,Reason,ExceptionType,InnerExceptionType,WorkcycleMinutes,AssistantCategory

2023-11-25T19:53:27.422Z,
EX2019,
ElcAssistant,
DB01,
2023-11-25T19:53:23.8885174Z,
OnDemand,
52089554-00cc-4007-b74f-3f4e370dc465,
StartProcessingMailbox,
,,,1440,Session

Wir können nach dem Zeittempel den Servernamen und den Prozess "ElcAssistant" samt Datenbank erkennen. Das "OnDemand" ist eine direkte Folge meines "Start-ManagedFolderAssistant"

Weitere Verzeichniss liefern primäre Informationen, wenn der Assistent eine neue Datenbank gefunden hat etc.

C:\Program Files\Microsoft\Exchange Server\V15\Logging\Assistants
C:\Program Files\Microsoft\Exchange Server\V15\Logging\Assistants\Submission 
C:\Program Files\Microsoft\Exchange Server\V15\Logging\Assistants\AssistantsService
C:\Program Files\Microsoft\Exchange Server\V15\Logging\ItemAssistants
C:\Program Files\Microsoft\Exchange Server\V15\Logging\MailboxAssistantsSlaReportLog

Fehleranalyse OnPremises Eventlog

Ein weiterer Eventlogeintrag liefert Informationen, welche "Assistenten", d.h. Module der Mailbox Assistent denn integriert hat.

Log Name:      Microsoft-Exchange-MailboxAssistants/Operational
Source:        Microsoft-Exchange-MailboxAssistants
Date:          11/29/2017 3:07:33 PM
Event ID:      7
Task Category: Discovery Operation
Level:         Information
Keywords:      
User:          SYSTEM
Description:
An assistant discovered:
Provider:be55f3a9-2966-4591-a68c-7c0c61b2c3e3
Assistant:ProvisioningAssistant
Identity:b4262426-a19c-463f-896f-d84059ee1881
Type:EventBased
Enabled:True

Ich musste natürlich mehrere Events auslesen, bis ich eine Liste ermittelt habe.

Get-WinEvent -LogName "Microsoft-Exchange-MailboxAssistants/Operational" `
| where {$_.id -eq 7} `
| % { ([xml]$_.toxml()).event.userdata.eventxml} `
| ft Assistant,Type,Enabled -autosize

Assistant                               Type           Enabled
---------                               ----           -------
XrmProvisioningTimeBasedAssistant       TimeBased         True
FreeBusyPublishingAssistant             EventBased        True
OnlineMeetingDetectionAssistant         EventBased        True
ClearCalendarAssistant                  EventBased        True
BirthdayAssistant                       EventBased        True
CalendarInteropAssistant                EventBased        True
RecipientDLExpansionEventBasedAssistant EventBased        True
RemindersAssistant                      EventBased        True
PushNotificationAssistant               EventBased        True
DarTaskStoreEventBasedAssistant         EventBased        True
DiscoverySearchEventBasedAssistant      EventBased        True
SharingFolderAssistant                  EventBased        True
CalendarNotificationAssistant           EventBased        True
ProvisioningAssistant                   EventBased        True
UMPartnerMessageAssistant               EventBased        True
MessageWaitingIndicatorAssistant        EventBased        True
ElcEventBasedAssistant                  EventBased        True
UserActivityAssistant                   EventBased        True
ConversationsAssistant                  EventBased        True
ApprovalAssistant                       EventBased        True
JunkEmailOptionsAssistant               EventBased        True
ResourceBookingAssistant                EventBased        True
GriffinEventBasedAssistant              EventBased        True
TimeProfileAssistant                    EventBased        True
CalendarAssistant                       EventBased        True
XrmProvisioningTimeBasedAssistant       TimeBased         True
XrmActivityStreamMaintenanceAssistant   TimeBased         True
XrmAutoTaggingMaintenanceAssistant      TimeBased         True
ActivitySharingTimeBasedAssistant       TimeBased         True
WeveMessageAssistant                    TimeBased         True
UserGroupsRelevanceAssistant            TimeBased         True
UMReportingAssistant                    TimeBased         True
TimeProfileTimeBasedAssistant           TimeBased         True
SuggestedUserGroupAssociationsAssistant TimeBased         True
UserInformationTableMaintenanceAssis... TimeBased         True
StoreUrgentMaintenanceAssistant         TimeBased         True
StoreScheduledIntegrityCheckAssistant   TimeBased         True
StoreMaintenanceAssistant               TimeBased         True
StoreOnlineIntegrityCheckAssistant      TimeBased         True
StoreDSMaintenanceAssistant             TimeBased         True
StoreCustomerExpectationMaintenanceA... TimeBased         True
SkypeContactCleanUpAssistant            TimeBased         True
SiteMailboxAssistant                    TimeBased         True
SharingPolicyAssistant                  TimeBased         True
SharingMigrationTimeBasedAssistant      TimeBased         True
SharePointSignalStoreAssistant          TimeBased         True
SearchIndexRepairTimebasedAssistant     TimeBased         True
ResourceUsageLoggingAssistant           TimeBased         True
ReminderSettingsAssistant               TimeBased         True
ShardRelevancyTimeBasedAssistant        TimeBased         True
ShardRelevancyMultiStepTimeBasedAssi... TimeBased         True
PublicFolderHierarchySyncAssistant      TimeBased         True
PublicFolderAssistant                   TimeBased         True
AddressListIndexAssistant               TimeBased         True
PeopleRelevanceAssistant                TimeBased         True
PeopleInsightsTimeBasedAssistant        TimeBased         True
PicwAssistant                           TimeBased         True
PeopleCentricTriageAssistant            TimeBased         True
OABGeneratorAssistant                   TimeBased         True
MailboxLifecycleAssistant               TimeBased         True
MailboxProcessorAssistant               TimeBased         True
MailboxDataExportAssistant              TimeBased         True
MailboxAssociationReplicationAssistant  TimeBased         True
JunkEmailOptionsCommitterAssistant      TimeBased         True
CalculatedValueTimeBasedAssistant       TimeBased         True
HashtagsRelevanceAssistant              TimeBased         True
GroupMailboxAssistant                   TimeBased         True
GroupCalendarSubscriptionAssistant      TimeBased         True
GriffinTimeBasedAssistant               TimeBased         True
GriffinLightweightTimeBasedAssistant    TimeBased         True
GoLocalAssistant                        TimeBased         True
FileExtractionTimeBasedAssistant        TimeBased         True
ElcAssistant                            TimeBased         True
DynamicAttachmentTimeBasedAssistant     TimeBased         True
DirectoryProcessorAssistant             TimeBased         True
DefaultViewIndexAssistant               TimeBased         True
DarTaskStoreTimeBasedAssistant          TimeBased         True
ContentSubmissionAssistant              TimeBased         True
ConferenceRoomUsageAssistant            TimeBased         True
ComplianceJobAssistant                  TimeBased         True
CleanupActionsAssistant                 TimeBased         True
CalendarSyncAssistant                   TimeBased         True
CalendarRepairAssistant                 TimeBased         True
ComposeGroupSuggestionTimeBasedAssis... TimeBased         True
BigFunnelRetryFeederTimeBasedAssistant  TimeBased         True
BigFunnelMetricsCollectionAssistant     TimeBased         True
CalendarInsightsAssistant               TimeBased         True
ContactCleanUpAssistant                 TimeBased         True

Das sind jede Menge Aufgaben, die der Mailbox Assistant ausführen kann.

Vermutlich kann man dem Mailbox Assistant noch mehr Informationen entlocken, wenn ich den "Get-EventLogLevel" hochschraube.

[PS] C:\>Get-EventLogLevel MSExchangeMailboxAssistants\*

Identity                                                                                                     EventLevel
--------                                                                                                     ----------
MSExchangeMailboxAssistants\Service                                                                          Lowest
MSExchangeMailboxAssistants\Discovery                                                                        Lowest

Das habe ich bislang aber nicht weiter untersucht, da ich während der Arbeit an dem Artikel das Problem mit "Export-MailboxDiagnosticLogs -component MRM" auf eine zu langsam Festplatte zurückführen konnte.

Start-MailboxAssistant

Neben dem Commandlet "Start-ManagedFolderAssistant" gibt es auch noch "Start-MailboxAssistant", um dem System etwas auf die Beine zu helfen.

Die Unterschiede habe ich noch nicht genau herausgearbeitet. Ich vermute, dass Start-MailboxAssistant einfach alle Aktionen auf einer Mailbox ausführt, während "Start-ManagedFolderAssistant" sich auf einen Teilbereich beschränkt.

Hier ist mit in einer gemischten Umgebung mit Exchange 2016/2019 ein vermutlich temporäres Fehlverhalten aufgefallen. In einer Exchange 2016 PowerShell konnte ich den Befehl nicht aufrufen, Wenn das Postfach auf einem Exchange 2019 CU13 SU4 Server lag. Der Fehler zeigt gut, dass die PowerShell den Befehl als Proxy per RPS (Remote Powershell) an den Zielserver weiterreichen wollte und der folgende Fehler aufgetreten ist.

[PS] C:\>Start-MailboxAssistant PSREport -AssistantName MRM
Error on Start-MailboxAssistant -AssistantName:'MRM'
-Identity:'PSReport'' to server EX01.msxfaq.net: Server version
15.02.1258.0000, Proxy method RPS:

Auch ein direkter Aufruf mit einer Exchange 2019 PowerShell wird mit einem Fehler quittiert:

Error 0x80040202 (Unknown error (0x80040202)) from StartWithParams
    + CategoryInfo          : NotSpecified: (:) [Start-MailboxAssistant], RpcException

Dazu passt ein Hinweis aus dem folgenden KB-Artikel, der aber schon das vorherige CU12 als "Lösung" beschreibt.

Die dort beschriebene Abhilfe funktioniert auch in meinem Fall. Ich starte auf dem Exchange 2019 Server eine normale PowerShell und binde mir die Exchange Admin Tools direkt lokal ein:

# Einbinden der lokalen Exchange Management Tools
Add-PSSnapin Microsoft.Exchange.Management.Powershell.E2010

# Antriggern
Start-MailboxAssistant PSREport -AssistantName MRM

Der Befehl kommt sehr schnell zurück und es ist auch mit einem "-verbose" nicht sichtbar, war er tatsächlich tut. Insofern kann ich nicht sehen, wo er ein "Flag" hinterlässt und ob dieses vom Hintergrundprozess dann auch wieder gelöscht wurde.

MRM in Exchange Online

Auch in Exchange Online gib es einen Troubleshooter, der z.B. die Archiv-Funktion für ein Postfach analysiert.

Schade, dass es für Exchange OnPremises nicht auch solche Assistenten gibt. Ich denke aber, dass auch die Assistenten im Hintergrund ebenfalls die Konfiguration prüfen und Analog zu "MailboxDiagnosticLogs" die Ergebnisse auswerten. Denn in der Cloud wird es sehr viele Server geben, die die MRM-Funktion umsetzen.

Hinweis: Microsoft verlagert die Compliance-Funktionen alle in das PurView-Portal.

Das bedeutet, dass Sie einige Dinge zukünftig besser in PurView einstellen und anderen weitere über MRM

To proactively retain or delete mailbox content for information governance in Microsoft 365, we recommend that you use retention policies and retention labels from the Microsoft Purview compliance portal, instead of messaging records management that's described on this page. However, you should continue using messaging records management to move messages to archive mailboxes.
Quelle: https://learn.microsoft.com/en-us/purview/retention

Postfach geleert?

Nach alldem Text bleibt natürlich die spannende Frage: Hat es denn funktioniert und wurden die Mails gelöscht? Ja, auch wenn ich weit und breit kein Protokoll (mehr) gefunden habe, indem die Löschvorgänge im Detail protokolliert wurden, waren alle Mails älter als 30 Tage im Postfach gelöscht. In dem Fall ist es mir nur nicht sofort aufgefallen, da es ein sehr "beschäftigtes" Postfach ist, in welches mehrere tausend Mails pro Tag laufen sind und das Postfach schon immer durch die oberen Quota-Grenze blockiert war, was dann natürlich wieder NDRs an den Absender (das Postfach selbst) generiert hat. Erst der Blick mit Get-MailboxFolderStatistics und Auswertung der ältesten Mail hat den Erfolg gezeigt.

Ja, ich gestehen, dass ein volles Postfach als Ziel für Statusmeldungen von PowerShell-Skripten vielleicht nicht die beste Wahl ist

Das Problem konnte ich durch die Richtlinie nun soweit lösen, dass die alten Mails bereinigt werden, neue Mails wieder zugestellt werden und das Postfach zukünftig die Festplatten nicht vollschreibt. Zudem habe ich wieder viel über die interne Funktionsweise von Exchange OnPremises und den "Exchange Mailbox Assistent" gelernt.

Weitere Links