Wie lassen sich SharePoint Site Collections aus einer Vorlage erstellen und damit "klonen"? Ob neue Teamräume, Projekträume oder Company Sites - es gibt zahlreiche Anwendungsfälle für die Verwendung von Vorlagen. Auch in meinen Projekten gibt es diese Anforderung seit vielen Jahren.
Die gute Nachricht: es ist alles recht einfach. Dank der PnP Community gibt es ein sehr angenehmes Set an PowerShell-Befehlen, mit denen wir in Nullkommanichts Vorlagen erstellen. Wie das funktioniert zeige ich im Folgenden.
PowerShell-Modul installieren
Um mit der Erstellung von Site Collection-Vorlagen loszulegen installieren wir ein PowerShell-Modul. Das geschieht auf Windows 10 via PowerShell:
Install-Module SharePointPnPPowerShellOnline
Dieser Befehl installiert den für SharePoint Online benötigten, größten Cmdlet-Umfang. Sollte es bei der Installation zu Problemen kommen, dann kann alternativ eine Setup-Datei hier heruntergeladen werden.
Die Cmdlets funktionieren teilweise sowohl in SharePoint Online als auch on-premises. Allerdings wird es on-premises zu Fehlern kommen, wenn Funktionen nicht unterstützt werden. Das merkt man dann recht schnell.
Für SharePoint 2013, 2016 und 2019 stehen auch zugeschnittene Module zur Verfügung. Diese sind genau auf den Funktionsumfang der jeweiligen SharePoint-Version reduziert. Weitere Informationen und Anleitungen dazu gibt es hier: PnP PowerShell overview.
Die Installation des Moduls muss mit Administratorrechten erfolgen, da es global im System installiert wird. Um die Installation ohne Administratorrechte durchzuführen kann folgender Befehl verwendet werden:
Install-Module SharePointPnPPowerShellOnline -Scope CurrentUser
Der Scope-Parameter installiert das Modul nur für den aktuellen Nutzer. Nach der Installation sind wir bereit für die Erstellung der ersten Vorlage.
Site Collection als Vorlage exportieren
Mit nur zwei Befehlen exportieren wir eine Site Collection als Vorlage:
Connect-PnPOnline -Url https://tenant.sharepoint.com/sites/template Get-PnPProvisioningTemplate -Handlers All -Out "template.xml" -PersistBrandingFiles
Mittels Connect-PnPOnline (auch on-premises!) stellen wir die Verbindung zur Site Collection her. Je nach Konfiguration der Farm (bspw. aktivierter Multifaktorauthentifizierung) müssen weitere Parameter ergänzt werden. Aber ich würde es erst mal so probieren, wahrscheinlich klappt das schon.
Der Befehl Get-PnPProvisioningTemplate schließlich exportiert die Site Collection in die Datei "template.xml". Der Parameter -PersistBrandingFiles speichert in Wikiseiten verwendete Bilddateien in einem Unterordner.
Das war es auch schon. Die Datei "template.xml" enthält nun eine Beschreibung der Site Collection - also welche Listen, Inhaltstypen, Berechtigungen, Felder, Navigationelemente, Konfigurationen etc. die Site Collection ausmachen.
Im nächsten Schritt erzeugen wir eine neue Site Collection auf Basis dieser Vorlage.
Site Collection auf Basis der Vorlage erstellen
Wir erzeugen neue Site Collections auf Basis einer Vorlage in zwei Stufen, indem wir
- eine neue Site Collection komplett im Standard anlegen
- die Vorlage auf diese Site Collection anwenden
Das erreichen wir mit folgenden Befehlen:
Connect-PnPOnline -Url https://tenant.sharepoint.com New-PnPSite -Type CommunicationSite -Title "Demo Site" -Url https://tenant.sharepoint.com/sites/neu Connect-PnPOnline -Url https://tenant.sharepoint.com/sites/neu Apply-PnPProvisioningTemplate -Path "template.xml" -Handlers All -ClearNavigation
Die Zeilen 1 und 2 erzeugen eine neue Communication Site "Demo Site". Ob das wirklich per PowerShell geschieht hängt vom Anwendungsfall ab. Die Site Collection könnte natürlich auch anders angelegt werden.
Die Zeilen 3 und 4 verbinden sich mit der neu erzeugten Site Collection und wenden die im vorigen Abschnitt exportierte Vorlage darauf an. Der Parameter -ClearNavigation verhindert, dass doppelte Menüeinträge erzeugt werden.
Fertig.
Einschränkungen bei der Erstellung von Vorlagen
Es gibt Einschränkungen des PnP Provisioning Frameworks. Diese können zu überraschenden Showstoppern werden, wenn man sie nicht kennt.
Die Vorlage enthält keine
- Listenelemente
- Dateien aus Dokumentenbibliotheken
- Modern Pages, mit Ausnahme der Homepage der Site*
Es gibt separate Cmdlets und Projekte mit denen sich diese Einschränkungen umgehen lassen.
Das Cmdlet Add-PnPDataRowsToProvisioningTemplate bspw. erlaubt es, Listenelemente in die Vorlagendatei zu exportieren. Für den Export der Modern Pages habe ich ein Ticket auf Github offen, mal schauen. In der Zwischenzeit können wir uns mit einem Extensibility Handler behelfen, der allerdings als Quellcode zur Verfügung steht und separat gebaut werden muss. Ich denke, das wird Thema eines weiteren Blogposts werden.
*Update 07/2019: Es gibt jetzt einen Parameter -IncludeAllClientSidePages, der wohl alle Modern Pages in das Template exportiert.
Zusammenfassung
Mit dem PnP Provisioning Framework lassen sich unkompliziert Vorlagen von Site Collections erstellen. Diese Vorlagen sind XML-Dateien, in denen (angepasste) Strukturen und Konfigurationen der Site Collections beschrieben sind. Vorlagen werden auf Standard-Site Collections angewendet; das Ergebnis ist eine der Vorlage ähnliche Site Collection. Inhalte wie Listenelemente, Dateien und Modern Pages sind nicht standardmäßig Teil der Vorlage.
Happy Templating!