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

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