Wipe-Mailbox / Purge-Mailbox
Gerade bei Migrationen kommt es immer wieder vor, dass man ein Postfach "nochmal" migrieren will. Wie bekommt man dann schnell die Inhalte einer vorherigen Migration aus diesem Postfach heraus? Bei Exchange 2003 gab es sogar noch ein "Purge Mailbox" im Kontextmenü, aber bei Exchange 2007/2010 ist dies nicht mehr vorhanden. Sicher kann ich den Benutzer das Postfach komplett entfernen und wieder ein neues Postfach zuweisen. Damit verliert der Benutzer aber auch alle anderen Exchange Einstellungen wie z.B. ProxyAdressen, Postfachgrenzwerte, Quotas, Empfangsbeschränkungen etc.
Ich habe dann erst einmal versucht per CDO oder EWS einfach rekursiv durch alle Ordner zu laufen und die Inhalten zu löschen. Aber es gibt natürlich Ordner, die per CDO nicht erreichbar sind (z.B. Ansichten, ActiveSync Einstellungen), generell nicht gelöscht werden können (z.B.: die Standardordner wie Posteingang, Ausgang, Kalender etc.) oder nur schwer zurückgesetzt werden können (z.B. Berechtigungen).
Ganz nebenbei dauert es natürlich auch eine nicht ganz unerhebliche Zeit, viele Elemente und Ordner zu löschen.
Recherche
Ich habe mich dann etwas auf die Suche begeben, ob es nicht noch einen anderen weg gäbe, Denkbar wäre natürlich einfach die Sicherung der bisherigen Exchange Einstellungen, ehe das Postfach gelöscht und der Import, nachdem das Postfach neu angelegt wurde. Aber es geht einfacher, wie ein Artikel in der TechNet ausführt:
„If you edit the msExchMailboxGUID value, altering
it by even a single character, the next time the affected User logs on,
a completely new mailbox will be generated, based on the new GUID. In
Exchange System Manager, you would see this User as now having two
mailboxes. (After a while, the Mailbox Cleanup Agent will run
automatically, and the User’s original mailbox will afterward display as
disconnected. Therefore, it would be a candidate für purging.) Suppose
you were to then return the msExchMailboxGUID to its original value. The
next time the User logged on, the original mailbox would again be
available, and the new mailbox would become disconnected.“
Quelle: understanding Mailbox GUIDs
http://technet.microsoft.com/en-us/library/aa996437%28EXCHG.65%29.aspx
Ein Skript muss also nur die GUID beim Active Directory Objekt verändern, dass Exchange die Mailbox in der Datenbank nicht mehr findet und beim ersten Connect eine neue Mailbox in der Datenbank anlegt. Alle Inhalte sind dann weg aber z.B. Berechtigungen auf das Postfach (z.B. SendAs), die ja im Active Directory stehen (im Feld msExchMailboxSecurityDecriptor) bleiben erhalten.
Die Daten des alten Postfach bleiben natürlich noch einige Zeit erhalten bis der Aufräumprozess das Postfach in der Datenbank als "Disconnected" erkennt und gemäß ihrer Einstellungen bezüglich Vorhaltezeit später dann entfernt.
Sollten Sie irrtümlich bei einem Benutzer die GUID geändert haben, dann können Sie dem Benutzer die neue GUID entfernen und dann das Postfach wieder verbinden. Alternativ können Sie natürlich auch einen neuen Benutzer anlegen und diesem das alte Postfach zuweisen und über Export-Mailbox die Daten zusammenführen.
Umsetzung
Ich habe mich entschieden, dieses Hilfsmittel als PowerShell-Skript unter der Nutzung der Exchange-Commandlets zu erstellen. Es funktioniert daher nur auf einem System, welches die Exchange 2007 oder Exchange 2010 Management Tools installiert hat.
Kopieren Sie einfach die folgenden Zeilen in eine Textdatei und speichern Sie diese als "wipe-mailbox.ps" ab.
# WIPE-MAILBOX # # changed the GUID of an Exchange 2007/2010 mailbox to force a new mailbox wihtout content # Tool für managing migrations and tests # # NOT für PRODUCTION uSE, # # Version 1.0 11 Feb 2010 # param ( [string]$identity=$null ) if ($identity -eq $null) { Write-Error "Please specify Mailbox Identity" } else { write-host "Given Identity : $identity" [string]$mailboxdn = (get-mailbox -identity $identity).distinguishedname write-host "Found MailboxUser: $mailboxdn" $User = [adsi]"LDAP://$mailboxdn" write-host "Bound AD-User :" $User.displayname $newguid = [guid]::NewGuid() write-host "Generated GUID :" $newguid $User.put("msexchmailboxguid",$newguid.tobytearray()) $User.setinfo() write-host "Generated GUID WRITTEN" }
Der Aufruf ist unspektakulär. Über den Parameter "Identity" wird eine für GET-MAILBOX gültige Identität übergeben
Das Skript sucht dann das Postfach dazu, holt sich den DistinguishedName und schreibt eine neue GUID.
Achtung:
Das Skript hat keine umfangreiche Fehlerbehandlung und erwartet
natürlich ein Objekt zurück. Ansonsten generiert es eine Fehlermeldung und mangels gebundenem AD-Objekt wird auch nicht geschrieben. Verstehen
Sie das Skript als "Beispiel" wie einfach und schnell per PowerShell
Lösungen geschaffen werden können.
In der Datenbank bleiben die Mails dann natürlich in dem nun nicht mehr verbundenen Postfach liegen, bis der Cleanup-Agent diese nach 30 tagen (Default) löscht. Seit Exchange 2010 SP1 können Sie dies beschleunigen mit
- Remove-StoreMailbox (Exchange 2010 SP1)
http://technet.microsoft.com/en-us/library/ff829913.aspx
Sollten Sie, warum auch immer, mal eine Mailbox ohne GUID konfigurieren, dann werden Sie dies beim nächsten Get-Mailbox sofort erfahren:
Ein kurzer Aufruf von "Set-Mailbox -ApplyMandantoryProperties" korrigiert dies umgehen.
Weitere Links
- MailboxGUID
- Fix-MailboxGuid
-
Remove-StoreMailbox (Exchange 2010 SP1)
http://technet.microsoft.com/en-us/library/ff829913.aspx - 291542 XADM: How to Map an msExchMailboxGuid Attribute to a User in Active Directory Users and Computer
- Understanding Mailbox GUIDs
http://technet.microsoft.com/en-us/library/aa996437%28EXCHG.65%29.aspx