Die Provisionierung von SharePoint-Listen und Feldern kann programmatisch über mehrere Wege umgesetzt werden. So bietet beispielsweise die SharePoint Management Shell (PowerShell) eine Möglichkeit um Site Collections und Listen in SharePoint zu verwalten. Mit PnP hat Microsoft ein weiteres PowerShell-Modul bereitgestellt, um neben der SharePoint-Umgebung auch u.a. Microsoft Teams unterstützt.
Dabei stellt eine Provisionierung gleichzeitig auf einer SharePoint-Online sowie -OnPrem-Instanz einige Herausforderungen dar. So laufen einige Zugriffe auf Ressourcen in SharePoint unterschiedlich ab. Zum einen kann das PnP-Modul nicht für sämtliche Funktionen genutzt werden, zum anderen werden diese auf einer OnPrem-Umgebung oft nicht im selben Umfang unterstützt wie in SharePoint Online.
Überblick
Dieser Blogbeitrag soll einen Erfahrungsbericht zur Provisionierung von SharePoint Site Collections, sowie Listen und Feldern dienen und was bei einer parallelen Entwicklung für SharePoint Online und OnPrem beachtet werden sollte.
Provisionierung von Site Collections
Um eine Site Collection erstellen zu können wird das SharePoint-Management-Shell-Modul verwendet. Hierbei existiert weder für OnPrem noch für Online ein passendes PnP-Modul. Installiert wird das benötigte Modul mit Add-PSsnapin Microsoft.SharePoint.PowerShell im PowerShell-Skript.
Im nachfolgenden Skript wird zunächst geprüft, ob bereits eine bestimmte Site Collection vorhanden ist. Ist dies der Fall, wird diese gelöscht und neu erstellt. Hierbei wird sofort ersichtlich, das trotz der Verwendung eines Entwicklungsmoduls, es unterschiedliche Befehle zum Ermitteln und Löschen der Site existieren: vgl. Remove-SPOSite (SharePoint Online) und Remove-SPSite (SharePoint OnPrem).
switch ($SharePointTyp) {
Online {
Connect-SPOService -Url $destinationSpAdminUrl -Credential $destinationSpCred
$siteCollection = Get-SPOSite $destinationSpUrl
if ($null -ne $siteCollection) {
Write-Host "### WebSiteCollection existiert bereits; wird gelöscht. ###"
Remove-SPOSite -Identity $destinationSpUrl -Confirm:$false
}
New-SPOSite -Url $destinationSpUrl -LocaleID 1031 -Owner $createdBy -Template "COMMUNITY#0" -Title $siteCollectionName -StorageQuota 100
Write-Host "### neue WebSiteCollection erstellt $($destinationSpUrl). ###"
}
OnPremise {
$siteCollection = Get-SPSite $destinationSpUrl -ErrorAction Ignore
if ($null -ne $siteCollection) {
Write-Host "### WebSiteCollection existiert bereits; wird gelöscht. ###"
Remove-SPSite -Identity $destinationSpUrl -GradualDelete -Confirm:$False
}
New-SPSite -Url $destinationSpUrl -Language 1031 -OwnerAlias $createdBy -Template "COMMUNITY#0" -Name $siteCollectionName
Write-Host "### neue WebSiteCollection erstellt $($destinationSpUrl). ###"
}
}
Berechtigungen der Site Collection
Um nun eine AD-Gruppe in eine SharePoint-Gruppe der Besucher der Site Collection hinzuzufügen kann das PnP-Modul verwendet werden.
Im folgenden Code-Ausschnitt wird die Besuchergruppe aus der SharePoint-Umgebung geladen und eine AD-Gruppe der SharePoint-Gruppe zugewiesen.
Connect-PnPOnline -Url $destinationSpUrl -Credentials $destinationSpCred
Get-PnPGroup -Identity $siteCollectionVisitorName
Add-PnPUserToGroup -LoginName $adGroupName -Identity $siteCollectionVisitorName
Erstellen von Websitespalten
Das Erstellen von Websitespalten kann ebenfalls mit dem PnP-Modul bewerkstelligt werden. Dabei kann neben der einfachen Erstellung von Spalten auch komplexere Spalten via XML definiert werden.
Im nachfolgenden Code-Auszug wird neben einer einfachen Feld-Erstellung (Add-PnPField) auch ein Feld mit einer komplexeren Logik angelegt. Hierbei können beispielsweise Berechnungen mit angegeben werden.
Connect-PnPOnline -Url $destinationSpUrl -Credentials ($destinationSpCred)
Add-PnPField -DisplayName "Vorname" -InternalName "myVorname" -Type Text -Group $fieldGroupName
$xml = '<field name="myName" id="" displayname="Name" type="Calculated" resulttype="Text" group="' + $fieldGroupName + '">
<formula>=myVorname</formula>
<fieldrefs>
<fieldref id="" name=""></fieldref>
</fieldrefs>
</field>'
Add-PnPFieldFromXml -FieldXml $xml
Diese Felder können dann auch ganz einfach einem Inhaltstyp hinzugefügt werden.
Das folgende Code-Listing zeigt die Erstellung eines neuen Inhaltstyps auf Basis des Inhaltstyps „Dokument“ und wie das zuvor erstellte Feld „myName“ diesem Inhaltstyp zugeordnet wird.
$cTypeParent = Get-PnPContentType -Identity "Dokument"
Add-PnPContentType -Name $contentTypeName -Group $groupName -ParentContentType $cTypeParent
Add-PnPFieldToContentType -Field "myName" -ContentType $contentTypeName
Fazit
Das PnP-Modul bietet zwar viele Funktionen an und ist für die Entwicklung in SharePoint-Online mit Sicherheit eine sehr gute Wahl, doch ist es insbesondere bei komplexeren Anforderungen sehr Aufwendig eine Formel bei der Erstellung eines Feldes hinzuzufügen.
Eine pauschale Aussage zwecks Nutzungsempfehlung lässt sich oft schwer treffen, allerdings haben viele Projekte gezeigt, dass die Verwendung von PnP-Modulen eine einfache Nutzung und die Verwendbarkeit sowohl im Online wie auch OnPrem-Umfeld große Vorteile bot.
Parallele Entwicklungen, bei denen man sowohl für eine Online wie auch OnPrem-Umgebung entwickelt, bieten immer das Risiko, dass entweder der Aufwand insgesamt ansteigt, oder das eine Umgebung eher „stiefmütterlich“ behandelt wird, da diese erst in der Zukunft berücksichtigt wird. Aus diesem Grund sollte man sich zunächst für eine Umgebung entscheiden und anschließend entsprechend einen Migrationspfad erstellen, um die Lösung in die neue Umgebung zu migrieren.