The estimated reading time 4 minutes
Postfach wöchentlich mit Aufgabe automatisch bereinigen lassen (Exchange 2013/2016)
Immer wieder kommt die Anforderung ein bestimmtes Postfach in einem bestimmten Zyklus zu löschen. Ich habe mich nun damit beschäftigt und hierfür eine Anleitung verfasst bzw. ein Powershell Skript geschrieben welches per Aufgabe (schedule task) ausgeführt werden kann.
Link zum Skript auf Github:
https://github.com/blog-it-koehler-com/mailbox-cleanup.ps1
UPDATE04-07-2019:
es gibt eine neue Version des Skriptes, in der mehrere Benutzer aufgeräumt werden können
https://github.com/blog-it-koehler-com/mailbox-cleanup.ps1/blob/master/mailbox-cleanup0.2.ps1
Vorbereitung:
ich empfehle das Skript als Aufgabe auf dem Exchange Server auszuführen. Hierfür benötigt der Benutzer keine Domänen-Admin Rechte. Das Skript funktioniert auch nicht als Domänen Admin, da dieser per Standard nicht die erforderlichen Rechte hat.
Deshalb erst die Vorbereitungen erledigen!
Ich habe hierfür einen speziellen „deleteuser“ angelegt. Dieser bekommt nun die notwendigen Berechtigungen auf meinem Exchange 2016.
Dazu muss die Exchange Powershell als Administrator geöffnet werden.
Nun folgenden Befehl in die Konsole eingeben:
New-ManagementRoleAssignment -Name ImportExportRole -User "domain\user" -Role 'Mailbox Import Export'
Wobei der Benutzer genommen werden muss der nachher auch das Recht erhalten soll Mails zu löschen (also der Benutzer mit dem das Skript ausgeführt werden soll).
WICHTIG: Benutzername den SamAccountName verwenden!
Wer diesen nicht weiß kann ihn sich mit folgendem Befehl anzeigen lassen (Get-Mailbox | fl name,alias,displayname,samaccountname)
In meinem Fall benutze ich den Benutzer „deleteuser“.
New-ManagementRoleAssignment -Name ImportExportRole -User "demo01\deleteuser" -Role 'Mailbox Import Export'
Nun muss der Benutzer noch in der Discovery Management Gruppe sein, da er ansonsten keine Postfächer durchsuchen darf.
Dies kann über Powershell oder über die GUI realisiert werden hier der GUI Weg.
Außerdem muss noch das Skript auf dem Server abgelegt werden.
Ich nutze den Dateipfad: C:\Scripts\mailbox-cleanup\mailbox-cleanup-0-1.ps1 .
Das Skript muss noch editiert werden:
Es muss der Benutzer angegeben werden, mit dem das Skript ausgeführt wird (in meinem Fall nun der deleteuser ) und der Benutzer welcher das Postfach geleert werden soll (hier test01).
Installation des Active Directory Powershell Modules (der Befehl kann auch direkt in der ISE eingegeben werden ).
Add-WindowsFeature RSAT-AD-PowerShell
Dieses Modul wird ebenfalls für das Skript benötigt.
Als weitere Vorbereitung muss der „deleteuser“ noch in die lokale Administratoren Gruppe des Exchange Servers, damit es keine Probleme bei der Anmeldung/ Zugriff auf Skript etc. gibt.
Als weitere Berechtigung muss der Benutzer Organization Admin sein, da sonst wichtige Teile des Skriptes nicht funktionieren. (falls die Exchange Gruppen nicht sichtbar sind, muss zuerst die erweiterte Ansicht im AD aktiviert werden).
Noch eine letzte Vorbereitung in der administrativen Powershell.
Set-ExecutionPolicy Unrestricted -Force
Vorbereitungen abgeschlossen.
Der eigentliche Task kann wie folgt angelegt werden (hierbei verwende ich die Standardpfade, sollten sich diese unterscheiden müssen sie natürlich angepasst werden)
Als Programm muss hier die Powershell.exe aufgerufen werden , danach die Argumente (Pfad muss eventuell angepasst werden)
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NonInteractive -WindowStyle Hidden -command ". 'C:\Program Files\Microsoft\Exchange Server\V15\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto; C:\Scripts\mailbox-cleanup\mailbox-cleanup-0-1.ps1
Nach dem Anlegen nochmals bearbeiten und den Benutzer als Ausführenden eintragen
Wenn der Benutzer keine Berechtigung hat sich als BatchJob anzumelden, dann erscheint folgende Meldung
Um dies zu erledigen muss die Locale Sicherheitsrichtlinie aufgerufen werden
hier ebenfalls den „deleteuser“ hinzufügen
Nun kann der Task gestartet werden.
Outlook vor der Bereinigung (es werden auch Kalendereinträge und sonstige Objekte gelöscht!)
Danach
Im Skript-Ordner wird dann das Logfile abgelegt
Man kann dann sehen wie viel Items gelöscht wurden.
Ich wünsche viel Spaß beim Testen. Bei Fragen einfach schreiben.
Hallo Alex,
schönes Skript und gut beschrieben.
Ich möchte das Skript nutzen um alle Mails die älter als x Tage sind aus allen Postfächern von Usern einer bestimmten AD-Gruppe zu löschen.
Wie man das mit den Tagen macht hast du bereits beschrieben, aber ich vermute das Skript muss größer umgebaut werden, wenn ich das auf mehere User anwenden will, da dann das Logging verändert werden muss, richtig?
Grüße,
Ben
Hi Ben,
vielen Dank für den Input. Ich habe gerade mal das Skript etwas geändert, sodass eigentlich mehrere Benutzer möglich sein sollten. Logging wird auch für mehrere Postfächer gemacht. Habe ne kleine foreach Schleife eingebaut. Kannst du das mal testen und nochmal schreiben?
https://github.com/blog-it-koehler-com/mailbox-cleanup.ps1/blob/master/mailbox-cleanup0.2.ps1
Ansonsten bin ich gerne für Verbesserungsvorschläge offen.
Viele Grüße
Alex
Hallo Alex,
aber wollte Ben das nicht so haben, dass er Mail die X Tage alt sind erst löscht?
Ich habe z.B. einige Postfächer da soll immer alles was älter als 30 Tage als ist gelöscht werden.
Hast du dazu noch eine Idee?
Grüße
Roland
Hi Roland,
naja das ging vermutlich mit dem Search-Mailbox -Searchquery received>=01/01/2015 AND received<=03/31/2015 Siehe:
Dazu müsste man Zeile 116 etwas umbauen, sollte aber auch kein Problem sein. Das Datum würde ich dann mit Get-Date auslesen und einfügen lassen, dann muss das Skript nicht mehr geändert werden.
Viele Grüße
Alexander
Vielen Dank für die Mühe…
Bei mir wird im Log folgendes ausgeworfen
maildeleteuser has Discovery Management permissions
maildeleteuser has Organization Management permissions
Permission for user maildeleteuser Import-Export is missing! Configure your user with the right permissions see command: New-ManagementRoleAssignment -Name ImportExportRole -User domain\user -Role ‚Mailbox Import Export‘, also check if the user is member of the Discovery Management Group in AD
Das ist ja anscheinend endlich mal eine genaue Fehlermeldung mit Anleitung – leider sind aber die Schritte genau befolgt worden und ein erneutes New-ManagementRoleAssignment bringt nur die Fehlermeldung, dass das Objekt bereits vorhanden ist. Mitglied im Discovery Management ist der User auch..
Noch eine Idee?
Danke
Andreas
Hallo Andreas,
hast du dich mit diesem Benutzer nochmals ab und wieder angemeldet am Exchange? Die Berechtigung greift erst nach danach. Siehe dazu:
https://jaapwesselius.com/tag/mailbox-import-export-role/
Kannst du mal in der Exchange Powershell folgenden Befehl absetzen?
“ Get-ManagementRoleAssignment -Role „Mailbox Import Export“ -RoleAssignee domain\user “
Das Skript prüft die Zugehörigkeit darüber ab, taucht dort dein Benutzer auf?
Da der Beitrag schon etwas älter ist, kann es auch sein, dass hier etwas geändert hat.
Viele Grüße
Alexander
Hallo,
schonal vielen Dank für das geniale Script. Funktioniert Super.
Gibt es vielleicht auch die Möglichkeit nur E-Mails zu löschen die älter als 30 Tage sind?
Gruß
Alexander
Hallo Alexander,
ja das ist sicherlich möglich.
Komme gerade leider nicht dazu es selbst zu testen, aber sollte mit einer veränderten SearchQuery kein Problem sein.
Somit müsste im Skript Zeile 114 angepasst werden.
Das sollte dann ungefähr so aussehen:
$30daysbefore = (get-date).AddDays(-30)
$date = get-date $30daysbefore -uFormat "%m/%d/%Y"
$deletestats = (Search-Mailbox -Identity $cleanupmailbox -SearchQuery "received<=$date" -DeleteContent -force)
Einfach mal testen und nochmals Bescheid geben.
Viele Grüße
Alex
Nachtrag: laut Aussage von Alex T. funktioniert die Anpassung. (siehe Kommentar)
Guten Abend,
ist es auch möglich, Email die älter als sind nur aus einem bestimmten Unterordner zu löschen?
Ich habe da immer so ServicePostfächer bei denen die User die Meldungen immer in verschiedene Ordner sortieren und nach 30 Tagen können die dann weg.
Hast du dazu einen Tipp für mich?
Vielen Dank
Hi Markus,
ich habe gerade mal gesucht aber auf die Schnelle nichts brauchbares gefunden. Hier wird mit dem cmdlet „Search-Mailbox“ gearbeitet, welches nur die beschriebenen Parameter unterstützt.
https://docs.microsoft.com/en-us/exchange/policy-and-compliance/ediscovery/message-properties-and-search-operators?view=exchserver-2019
Beim Parameter „identity“ lässt sich kein Unterordner angeben, da muss nur die Mailbox ausgewählt werden (zumindest war das mein Stand).
Allerdings lassen sich ältere Mails löschen mit dem Suchparameter „received>=01/01/2015 AND received<=03/31/2015". Dies liese sich sicherlich noch mit Get-Date nachjustieren, sodass man nicht immer ändern muss. Viele Grüße Alexander