Get-DLLastUsed
Manchmal stellen sie sich die Frage, ob ein Mailverteiler wirklich noch genutzt wird. Warum fragen wir nicht das Messagetracking, wann das letzte Mal eine Mail an den Verteiler gegangen ist?
Was ist ein inaktiver Verteiler?
Zuerst müssen wir uns überlegen, woran wir obsolete Verteiler überhaupt erkennen können. Verteiler werden von Anwender meist an zwei Stellen benutzt:
- Berechtigungen
Wenn der Verteiler eine Sicherheitsgruppe ist, können Anwender diese gruppe nutzen, um Berechtigungen z.B. auf das Postfach oder einzelne Ordner zu gewähren. Das ist ein häufiger Fall bei Räumen und SharedMailboxen, weil Sie als Administrator nur einmal eine Gruppe anlegen und berechtigen müssen aber die spätere Pflege der Mitglieder, und damit effektiv berechtigten Personen, über das Identity-Management erfolgen kann. Sie sind gut beraten, wenn Sie solche Berechtigungsgruppen durch ein Namenskonzept entsprechen Kennzeichen und vielleicht den Mailempfang unterbinden und diese im Adressbuch verstecken. - Mailverteiler
Häufiger werden aber Gruppen anlegt, um Mails zu verteilen. Grundsätzlich ist es eine neue Funktion, auch wenn ich kein Freund bin, eine Mail in mehreren Kopien in mehreren Postfächern abzulegen. Zumindest innerhalb der gleichen Firma wäre hier ein Teams Gruppenchat oder Kanal die bessere Option. Ansonsten können wir nur das Messagetracking bemühen.
Aber es gibt die Verteiler und wenn Sie diese loswerden wollen, dann sollten wir die verbliebene Nutzung prüfen.
Wenn eine Gruppe natürlich gar keine Mitglieder mehr hat, dann ist dieser zumindest zu hinterfragen. Auch Verteiler mit nur einem oder sehr wenigen Mitgliedern können per LDAP oder Graph schnell gefunden werden. Eine kurze Rückfrage an die Mitglieder oder den Besitzer ist oftmals der leichtere Weg, auch wenn der ein oder andere Administrator dann über seinen Schatten springen müsste.
Berechtigungen auslesen
Ob eine Verteiler für Berechtigungen verwendet wurde, ist sehr schwer zu ermitteln. Sie müssten durch alle Postfächer und alle Ordner durchlaufen und mit "Get-MailboxfolderPermission" die Rechte ermitteln und nach den Gruppen suchen. Dazu brauchen sie schon erhöhte Rechte, denn Sie bekommen ja damit alle Ordnernamen in den Postfächern zu sehen.
Exchange Online Messagetracking
Um die Nutzung einer Gruppe als Verteiler zu analysieren, bleibt im Grunde nur das Messagetracking. Sie können zwar mit "Get-Distributiongroup" die Liste erstellen aber es gibt kein Property "LastUsed" oder "LastMessage" o.ä. und ich möchte nicht durch alle Mails aller Postfächer laufen, um dann in den Empfängern nach den Verteilern zu suchen. Also bleibt nur das Messagetracking. Viele Firmen nutzen mittlerweile Exchange Online als primäres Mailsystem und damit löst auch Exchange Online die Verteiler meist schon auf. Daher habe ich mich auf Exchange Online beschränkt. Der Code kann aber einfach auch für Exchange OnPremises angepasst werden. in Exchange Online gibt es aber kein "Get-Messagetracklinglog" und das "Get-MessageTrace" wurde im Sep 2025 auch abgeschaltet. Heute ist "Get-MessageTraceV2" angesagt. Dabei gibt es einige Dinge zu beachten, die aus der Beschreibung zum Commandlet auch gut hervorgehen:
- Get-MessageTraceV2 (ExchangePowerShell)
https://learn.microsoft.com/en-us/powershell/module/exchangepowershell/get-messagetracev2
Drei Dinge sind hier zu beachten
- Zeitraum, 90 Tage und max. 10 Tage
Sie können mit dem Parameter StartDate und EndDate den Zeitraum angeben. Sie können aber maximal 90 Tage zurück und der Zeitraum darf 10 Tage nicht überschreiten
Wir müssen daher 90 Abrufe a 10 Tage machen. Idealerweise fangen wir mit den letzten 10 Tagen an und brechen ab, wenn wir eine Mail gefunden haben.
Kritischer sehe ich aber, dass keine Informationen vorliegen, wenn ein Verteiler länger als 90 Tage nicht mehr genutzt wurde. - Throttling
Der zweite Punkt ist das "Drosseln" durch Microsoft, was uns effektiv auf eine Anfragen alle 3 Sekunden beschränkt

Quelle: https://learn.microsoft.com/en-us/powershell/module/exchangepowershell/get-messagetracev2
Der Fehler wird in der Powershell angezeigt aber es wird kein Retry gemacht.

Wir müssen uns hier also selbst drum kümmern. Blöde ist natürlich, dass das Throttling (Graph Throttling) nicht von der Menge der zurückgegebenen Daten abhängig ist. Auch ein Aufruf ohne Ergebnisse zählt als Aufruf und bremst die Verarbeitung. Wer 1000 Verteiler prüft, muss mindestens 3000 Sekunden = 50 Minuten Laufzeit einplanen. Wenn dann die letzte Mail länger als 10 Tage her ist, verlängert sich die Abfrage um weitere 3 Sekunden pro 10 Tage und Verteiler. Im Extremfall dann 500 Minuten oder ca. 20 Stunden. Wohl dem, der auf Mailverteiler vorfiltern kann und die Berechtigungsgruppen am Namen unterscheiden kann - Paging
Zuletzt liefert das Commandlet nur die ersten 1000 Werte und entsprechend müsste man das Zeitintervall reduzieren. Darauf verzichte ich, denn ich möchte ja nur wissen, ob und wann eine Mail
Es gibt meines Wissens keinen Report von Exchange Online oder im Microsoft 365 Admin Center, der hier helfen würde.
Skript
Das Skript ist relativ einfach gestrickt und erwartet eine bereits verbundene Exchange Online PowerShell. Der einzige Parameter ist der Dateiname für die Ablage als CVS-Datei und per per Default gesetzt:
Wenn Sie den Wert auf "$null" setzen, dann erfolgt die Ausgabe in die Pipeline. Weitere Parameter zur Filterung der Eingabe oder die Übernahme der Gruppen über eine Pipeline habe ich nicht eingebaut.
Speichern Sie die Datei auf ihrem Client, ändern Sie die Erweiterung von TXT auf PS1 starten Sie eine PowerShell und verbinden sie sich vorab mit Exchange Online. Per Default werden ALLE Verteiler mit Get-Distributionlist gelesen und das Ergebnis in eine "DistributionGroupsLastUsed.csv" im aktuellen Verzeichnis gespeichert.
Hinweis:
Wenn Sie sich als Benutzer verbinden,
kann die längere Laufzeit zu einer Unterbrechung führen und
einen Anmeldedialog anzeigen. Ich empfehle die Nutzung des
Skripts mit einem Service Principal oder App Registration.
Siehe auch
EXO PowerShell Automation.
Mittlerweile habe ich das Skript bei einem größeren Kunden eingesetzt und musste häufiger mit Abbrüchen und Timeouts kämpfen. Daher gibt es eine erweiterte Version, die einen Zwischenstatus in einer CSV-Datei puffert und damit nach einem Abbruch wieder aufsetzen kann. Diese Version ist aber noch nicht öffentlich. Sprechen Sie mich an, wenn Sie diese testen wollen.
Ausgabe
Das Skript gibt eine Liste über die Pipeline oder direkt in eine CSV-Datei aus.

Wenn eine Mail an die Verteilerliste gefunden wurde, dann steht das Datum als auch der Absender und der Betreff der neuesten Mail mit in der CSV-Datei.

Pro Verteilerliste gibt es genau eine Zeile. Eine weitere Auswertung mit eigenen Skripten, Excel, PowerBi o.ä. ist dann einfach.
Weiterentwicklung
An dem Skript gibt es eigentlich kaum mehr Potential für mehr, denn die Eckwerte 90 Tage maximal , 10 Tage und 3 Sekunden pro Abruf gibt es nichts zu rütteln. Wer hier mehr oder schnellere Antworten haben möchte, kann dies nur über ein eigenes Log-Management machen, welches das Messagetracking längere Zeit aufbewahrt. Entsprechende "LogSysteme", wie Elastic, Graylog, Splunk etc. gibt es viele und entsprechende Beispielimplementierungen auch. Da Exchange leider die Messagetrackinglogs nicht selbst per SYSLOG o.ä. weiterleiten kann, müssen Sie diese Informationen regelmäßig abrufen.
- Microsoft Exchange Online Message Trace
| Elastic integrations
https://www.elastic.co/docs/reference/integrations/microsoft_exchange_online_message_trace
Weitere Links
- EXO PowerShell Automation
- Graph Throttling
- Message Tracking in Exchange Online
- Message Tracking Grundlagen
- Get-MessageTraceV2 (ExchangePowerShell)
https://learn.microsoft.com/en-us/powershell/module/exchangepowershell/get-messagetracev2 - Microsoft Exchange Online Message Trace
| Elastic integrations
https://www.elastic.co/docs/reference/integrations/microsoft_exchange_online_message_trace















