Januar 4, 2025

Migration von onprem Public Folders zu Shared Mailbox mit PowerShell

Viele Wege führen nach Rom…

Ihr könnt Onprem Public folders komplett 1:1 nach Exchange Online migrieren. Optional könnt ihr im Ziel diejenigen PFs, die nicht (mehr) genutzt werden oder bei denen der Verdacht besteht, um alle PublicFolderClientPermissions erleichtern – und dann warten, bis sich jemand beschwert. Etwas Mut zur Lücke sozusagen. Der Haken ist, dass ihr hierdurch weiterhin eine wenig zukunftsträchtige Technologie am Leben erhaltet. Vermutlich landet so auch viel Datenmüll in der Cloud, den niemand mehr braucht.

Alternativ gibt es kostenpflichtige Migrationstools, mit denen die 1:1-Migration leichter von der Hand geht als mit den Microsoft Skripten. Es gibt hier eine Reihe von Anbietern wie z.B. CodeTwo oder BitTitan.

Wenn ihr einzelne Ordner aus der Public Folder Struktur herauslösen und auf modernere Art und Weise bereitstellen wollt, könnt ihr das ebenfalls über kostenpflichtige Tools machen – wenn das Ziel eine Microsoft 365 Group sein darf, geht es auch kostenlos. Im Idealfall migriert ihr so nur die relevanten Inhalte zu Microsoft 365 Groups. Der Weg des geringsten Widerstands ist aber natürlich die 1:1-Migration. Man kann aber auch beide Wege kombinieren: Alles, was sich klären lässt, zu Microsoft 365 Groups migrieren, den Rest über die 1:1-Migration.

Microsoft 365 Groups als Migrationsziel sind prinzipiell eine feine Sache, haben aber einige Limits:

  • max 50 GB
  • nur email und calendar content
  • keine Ordner-Struktur bzw. nur 1 Ebene
  • keine vollwertigen MailboxFolderPermissions
  • keine Inbox rules, z.B. auch keine automatischen Antworten

All diese Limits haben Shared Mailboxes nicht. Wäre es da nicht schön, wenn es auch hier einen (kostenlosen) Weg gäbe? Nachdem ich in der jüngeren Vergangenheit viel mit PowerShell und der EWS API hantiert hatte, fiel mir in bester „Wer nur einen Hammer als Werkzeug hat, für den ist jedes Problem ein Nagel“-Manier ein: bekomme ich bestimmt schnell damit hin… Gut, ich gebe zu, am Ende war es alles andere als schnell. Aber es hat funktioniert! 🙂

Der Ablauf ist grob wie folgt:

  1. Sicherstellen, dass der Admin, der zur Migration genutzt wird, Zugriff auf die Public Folder Ordnerstruktur hat
  2. Ordner bzw. Ordnerstruktur per Skript in eine onprem Shared Mailbox migrieren
  3. Die Shared Mailbox ganz normal zu Exchange Online migrieren

Das war es schon.

Punkt 1 kann z.B. mit diesem Einzeiler erreicht werden

Get-PublicFolder -Identity "\Folder Name" -Recurse | Add-PublicFolderClientPermission -User jsmith -AccessRights Owner

Das Skript unterstützt bislang keine direkt Migration zu Exchange Online. Ursprünglich hatte ich geplant, dies ebenfalls zu implementieren, bin dann aber wegen des großen Aufwands davon abgerückt. Zusammen mit der anschließenden Postfach-Migration funktioniert das Ganze gut genug, finde ich.

Um das Ganze ein bisschen zu strukturieren und um mich besser zurecht zu finden, habe ich eine separate Datei mit Funktionen gebaut, die im Hauptskript per „Dot-sourcing“ geladen werden.

Vorweg ein großer Dank an Glen Scales, an dem man quasi nicht vorbeikommt, wenn man sich mit der EWS API via PowerShell beschäftigt. Ohne seine großartige Bibliothek an Funktionen wäre das hier niemals mit erträglichem Aufwand möglich gewesen. Ich habe mich sehr umfangreich bedient und mit leichten Anpassungen „nur noch“ die Logik drumherum hinzugefügt. Die EWS API gibt es übrigens hier.

Funktionen

Gehen wir die kurz die wichtigsten Funktionen durch:

Get-FolderFromPath

Liefert einen Ordner in einer Mailbox zurück. Die Funktion wird u.a. zur Prüfung genutzt, ob ein zu migrierender Ordner in der Zielmailbox schon vorhanden ist

PublicFolderIdFromPath

Ist ähnlich wie die vorige Funktion (mit reduziertem Output), allerdings auf Public Folder gemünzt, nicht auch Mailboxen. Liefert die EWS Id eines Public Folder zurück. Die Funktion ist essentiell für die folgende Funktion „Get-PublicFolderItems“.

Get-PublicFolderItems

Das Herzstück des Skripts. Eigentlich vom Autor zur Auflistung der Elemente in einem Public Folder konzipiert, habe ich das Ganze um das Kopieren der Elemente in die Ziel-Mailbox erweitert. Das Skript prüft vor dem jedem Kopiervorgang, ob es das Element schon früher kopiert hat, was erneute Durchläufe stark beschleunigt (quasi ein Delta-Sync by default).

Ein erneuter Durchlauf sieht z.B. so aus:

Ansonsten gibt es noch eine ganze Reihe an weiteren Hilfsfunktionen, die u.a. zum EWS Verbindungsaufbau dienen. Den kompletten Code gibt es hier.

Hauptskript

Nun zum Hauptskript. Ruft man es ohne Parameter auf, erscheint ein Dialog, der zur Auswahl des zu migrierenden Public Folder auffordert.

Wähle ich hier wie markiert „Folder1.2“ wird der Inhalt dieses Ordners inkl. aller Unterordner (1.2.1, 1.2.2 und 1.2.3) migriert. Es folgt ein weiterer Dialog, der zur Angabe der OU auffordert, in der das Benutzerkonto erstellt werden soll, für das im Folgenden eine Shared Mailbox erstellt wird.

Und schon geht es los mit der Erstellung der Mailbox.

Die unten angezeigten Ordner werden anschließend der Reihe nach durchlaufen. Dabei werden entsprechende Ordner in der Ziel-Mailbox angelegt und Inhalte von A nach B kopiert.

Ich gebe zu, der Output ist ziemlich unübersichtlich. Um Logging (Transkript o.ä.) habe ich mich bisher auch nicht gekümmert – mir reichte es bisher so und ich habe schon mehrere Migrationen damit gemacht. Wenn ihr mehr wollt, passt das Ganze gerne euren Bedürfnissen an.

Das Skript bietet ebenfalls Unterstützung für die Migration von Mail-relevanten permissions. Wenn ein User Zugriff auf einen PublicFolder hat, erhält er FullAccess auf die Ziel-Mailbox inkl. Automapping. Wer SendAs permissions auf den Quell PF hat, erhält ebenso SendAs auf die Ziel-Mailbox. Zu guter Letzt hilft das Skript beim Aufruf mit dem entsprechenden Parameter auch beim „Cutover“ in Sachen Mailflow. Hierbei wird für die migrierten Mail-enabled Public Folder ermittelt, welche SMTP-Adressen sie haben. Das konkrete Beispiel fällt nicht in diese Kategorie.

Anschließend wird es ernst: Bei aktiviertem Parameter „-cutoverMailflow“ werden die mail-enabled PFs in der Quelle mail-disabled. Nach einer kurzen Gedenkpause werden die nun freigewordenen Adressen der Ziel-Mailbox zugeordnet. Ohne den Parameter wird nur ein „whatif“ durchgeführt. Den kompletten Code gibt es hier.

Das Ergebnis kann man dann in Outlook bewundern: Eine zusätzlich eingebundene SharedMailbox mit dem Namen des migrierten Ordners – und dort drin die umgebene Ordnerstruktur. Im aktuellen Beispiel wird „Folder1“ nur durchquert und ist leer, alle Unterordner enthalten aber natürlich die migrierten Elemente.

Nun fehlt nur noch die Migration nach Exchange Online. Kleiner Tipp: Wenn ihr vor der Migration alle non-synced User aus den Berechtigungen entfernt, läuft die Migration in die Cloud geschmeidiger. Ansonsten gibt es eine Vielzahl von erwartbaren Fehlern, die ihr aber normalerweise ignorieren könnt.

Viel Spaß bei der Migration! 🙂

PS: Ich übernehme keinerlei Haftung für etwaige Schäden, benutzt es auf eigenes Risiko! Wenn ihr Unterstützung braucht, meldet euch gerne.

0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x