Im Microsoft SharePoint ist es grundsätzlich nicht möglich, bei einer bestehenden Website die Website-Vorlage auszutauschen. Der einzige Weg dies zu erreichen, ist eine neue Website mit der gewünschten Vorlage zu erstellen und den gewünschten Inhalt irgendwie übernommen. In diesem Beitrag zeige ich, welche Möglichkeiten es gibt und wie dieser Schritt mit zwei PowerShell-Scripts sehr einfach automatisiert werden kann.
Wird im SharePoint beispielsweise eine Teamwebsite erstellt, bleibt diese für immer eine Team-Site. Soweit so gut. Wenn aber z.B. im früheren SharePoint 2010 ein Besprechungsarbeitsbereich (Meeting-Workspace) erstellt wurde, kann diese im SharePoint 2013 zu einer Herausforderung werden, da diese Website schlicht nicht mehr funktioniert. Wenn die Website also noch benötigt wird, muss diese auf eine andere Vorlage migriert werden.
Ein anderes Praxisbeispiel ist, dass früher einmal mit dem Project Server experimentiert wurde und darauf produktiver Inhalt erstellt wurde. Jetzt will man aber den Project Server nicht mehr betreiben. So müssen alle noch benötigten Project-Websites migriert werden auf andere Websites. Ähnliches trifft zu, wenn man ein Downgrade von SharePoint Standard auf SharePoint Foundation durchführen will.
Zur Unterstützung der Datenmigration gibt es entweder umfangreiche Enterprise-Lösungen von Drittherstellern wie MetaLogix, AvePoint oder Sharegate. Über PowerShell können diese Schritte aber auch sehr leicht automatisiert werden, ohne Dritthersteller-Tools.
Schritt 1: Alle Listen exportieren auf das Datei-System
Als ersten werden von einer Website alle Listen und Bibliotheken einzeln exportiert auf das Dateisystem. Falls gewünscht kann der Export jetzt oder später noch gefiltert werden, sodass z.B. versteckte Listen wie die Benutzerinformationsliste ausgeschlossen werden. Der Befehl Export-SPWeb erstellt standardmässig komprimierte cmp-Dateien. In Einzelfällen empfehle ich aber -NoFileCompression zu verwenden, weil das Export-Format für den Menschen lesbarer ist. Der Export-Vorgang dauert aber dann ca. 30% länger.
$sourceWebUrl = "https://contoso.ch/alte_website"
$backupFolder = "C:\Backup\alte_website\"
$sourceWeb = Get-SPWeb $sourceWebUrl
$sourceWeb.Lists | ForEach-Object {
$list = $PSItem
$backupPath = $backupFolder + $list.Title + ".cmp"
$itemUrl = "/" + $list.RootFolder.Url
Write-Host "Will Backup $($list.Title) URL $itemUrl" -ForegroundColor Yellow
Export-SPWeb $sourceWeb -Path $backupPath -ItemUrl $itemUrl -IncludeVersions All -IncludeUserSecurity -NoFileCompression
}
Schritt 2: Importieren der gewünschten Listen
Mit dem vorherigen Script wurden alle Listen exportiert auf das Dateisystem. Von Dateisystem werden sie nun wieder importiert auf der neuen Ziel-Website. Falls einige Listen nicht importiert werden sollen, empfehle ich einfach die entsprechende Backup-Datei zu löschen (bzw. den Backup-Ordner bei der NoFileCompression-Methode).
$backupFolder = "C:\Backup\alte_website\"
$targetWebUrl = "https://contoso.ch/neue_website"
Get-ChildItem "$backupFolder\*.cmp" | ForEach-Object {
$backupPath = $PSItem.FullName
Write-Host "Will Restore $($PSItem.Name)" -ForegroundColor Yellow
Import-SPWeb $targetWebUrl -Path $backupPath -IncludeUserSecurity -NoFileCompression
}
Vorteile dieses Lösungsansatzes
- Sehr schlanke und schnelle Lösung
- Spart im Vergleich zu einer manuellen Migration der Listen und Bibliotheken mehrere Stunden Arbeit
- Alle Versionen und Berechtigungen können übernommen werden
- Es wird ein Standard-Tool von Microsoft verwendet
- Es muss keine zusätzliche Software evaluiert, installiert oder lizenziert werden
- Da alle Listen als XML-Dateien abgebildet werden, können, falls gewünscht, kleinere Korrekturen durchgeführt werden, die sonst umständlich bis unmöglich wären (z.B. löschen von beschädigten Spalten oder fehlenden Feldtypen am Zielort) – mit entsprechender Vorsicht!
Einschränkungen dieses Lösungsansatzes
- Unterwebsites (Subsites) müssen einzeln exportiert und wieder importiert werden
- Website-Einstellungen und Workflow-Verlauf werden nicht übernommen