bluebay2014 - Fotolia

PnP-PowerShell-Befehle für das SharePoint-Management

Das neue PnP-PowerShell-Modul bietet mit über 500 Cmdlets Funktionen über verschiedene Services hinweg. Das soll Administratoren die Verwaltung von SharePoint erleichtern.

Die Cloud bringt ein erhebliches Maß an Komplexität in die Verwaltung von Office-Programmen. Microsoft hat deshalb PowerShell ein PnP-Modul hinzugefügt, das Administratoren diese Aufgabe erleichtern soll.

Die Verwaltung von Microsoft 365 ist mitunter eine komplizierte Angelegenheit: Microsoft teilt die Verwaltung von Sicherheit und Compliance in verschiedene Portale auf, und die meisten Dienste verfügen über ein eigenes Admin-Portal. Für Services wie SharePoint Online stellt Microsoft ein PowerShell-Modul für die grundlegende Webseitenverwaltung zur Verfügung. Community-Mitglieder haben mit Microsoft zusammengearbeitet, um das PowerShell-Modul Patterns and Practices (PnP) zu veröffentlichen, das zahlreiche wichtige Funktionen hinzufügt.

Was ist das PnP-PowerShell-Modul?

Die ursprüngliche Version des PnP PowerShell-Moduls – PnP PowerShell v3 – verwaltete nur SharePoint Online- sowie lokale SharePoint-Produkte und erforderte für den Betrieb Windows PowerShell. Es ist nicht kompatibel mit PowerShell 7 und die Community hat angekündigt, es nicht mehr zu überarbeiten.

Seit Januar 2021 gibt es nun die neue PnP.PowerShell, die mit der betriebssystemübergreifenden PowerShell funktioniert, und deren Fähigkeiten über SharePoint hinausreichen. Das neue Modul verfügt über mehr als 500 Cmdlets zur Verwaltung von SharePoint Online, Microsoft Teams, Microsoft Planner und Microsoft Flow. Diese Konsolidierungsbemühungen dienen dazu, die Zahl der notwendigen PowerShell-Module zu verringern und die Arbeit zu vereinfachen.

Wozu verwende ich das PnP-PowerShel-Modul?

Das Modul Microsoft SharePoint Online Service bleibt das Verwaltungs-Tool für SharePoint mit grundlegenden Befehlen zum Verbinden, Hinzufügen, Aktualisieren und Entfernen von Elementen wie Websitesammlungen, Websites und Bibliotheken.

PnP PowerShell ersetzt es nicht, bietet jedoch einige Verbesserungen bei der Verwaltung von SharePoint Online mit PowerShell.

Um beispielsweise eine Verbindung mit einer SharePoint-Websitesammlung herzustellen und alle Webseiten mit PowerShell zu iterieren, müssen Sie eine Verbindung zu SharePoint Online herstellen und dann alle Websitesammlungen abrufen. Vor PnP Powershell mussten Sie in PowerShell-Skripten clientseitige Objektmodellverweise (Client Side Object Model, CSOM) und Bibliotheken verwenden, um Unterseiten zu iterieren.

Diese Vorgehensweise ist umständlich und erfordert umfangreiche Befehle, das Erstellen neuer Verbindungen und Anmeldeinformationsobjekte und das Laden jeder Ebene aus der Websitesammlung auf die Unterwebsite. Der Code ist anfällig für Verbindungsprobleme und gibt oft 403-Fehler zurück.

Das PnP PowerShell-Modul zielt darauf ab, diese Probleme zu lösen und mit neuen, verbesserten oder kombinierten Funktionen sowie CSOM-Code für einen optimierten Ansatz das Schreiben von PowerSell-Skripten erleichtern.

Laden Sie das PnP PowerShell-Modul herunter und richten Sie es ein

Sie erhalten die neueste Version des PnP PowerShell-Moduls mit dem folgenden Befehl:

Install-Module -Name PnP.PowerShell

Um Preview-Buildversionen zu verwenden, fügen Sie dem Befehl den Parameter -AllowPrerelease hinzu. Sie erhalten somit die neuesten Funktionen, es besteht jedoch das Risiko, dass das Modul in dieser Version noch Fehler enthält.

Das Verbinden von PowerShell mit Microsoft 365 ist entweder über Azure Active Directory (Azure AD) oder über das MSOnline-PowerShell-Modul möglich. Doch zuvor müssen Sie einen Zugang einrichten. Dann erstellen Sie eine Azure-AD-Anwendung; über diese wickeln nachfolgende Anfragen die Verbindung und den Zugriff ab.

Abbildung 1: Sie müssen PnP PowerShell erst eine Erlaubnis erteilen, ansonsten erhalten Sie beim Versuch, Befehle auszuführen, nur eine Warnmeldung.
Abbildung 1: Sie müssen PnP PowerShell erst eine Erlaubnis erteilen, ansonsten erhalten Sie beim Versuch, Befehle auszuführen, nur eine Warnmeldung.

Melden Sie sich dafür bei Azure AD als globaler Administrator oder auf einem anderen Konto mit den notwendigen Berechtigungen an. Führen Sie dann den folgenden Befehl aus:

Register-PnPManagementShellAccess

Sie werden nun aufgefordert, dem Modul die Berechtigung zu erteilen.

So verwenden Sie das PnP PowerShell-Modul

Testen wir das PnP-PowerShell-Modul, indem wir alle Websites von SharePoint Online abfragen:

Connect-PnPOnline "https://{Tenant}-admin.sharepoint.com"
$sitecollections = Get-PnPTenantSite

Um nun auch sämtliche Unterwebsites zu iterieren, verwenden Sie zusätzliche Befehle:

foreach ($sitecollection in $sitecollections)

{

   Connect-PnPOnline -Url $sitecollection.Url -Anmeldeinformationen $creds

   Get-PnPSubWebs

}

Der Vorteil des PnP-PowerShell-Moduls ist, dass Sie einen saubereren Code zum Ausführen einer Vielzahl von Aktionen erhalten, ohne verschiedene Befehlstypen zu nutzen, wie das zum Beispiel bei PowerShell in Kombination mit CSOM notwendig wäre.

Verwalten von Dateien und Ordnern in SharePoint Online

Das Erstellen neuer Ordner und das Löschen, Hochladen oder Verschieben von Inhalten sind typische Aufgaben mit SharePoint Online, die mit der grafischen Benutzeroberfläche (Graphic User Interface, GUI) umständlich umzusetzen sind. Durch die PowerShell-Automatisierung können Sie Zeit sparen und Konsistenz sicherstellen.

Um alle Ordner innerhalb einer bestimmten Seite zu iterieren, verbinden Sie sich zuerst mit der Seite und verwenden Sie dann Get-PnPFolderItem:

Connect-PnPOnline "https://{Tenant}.sharepoint.com/sites/Demo/DemoSubsite" -Credentials $creds
$folder="/Shared Documents"
$folders = Get-PnPFolderItem -FolderSiteRelativeUrl $path -ItemType Folder
foreach($folder in $folders)
{
     Write-Host "$($folder.Name) - $($path)/$($folder.Name)" -ForegroundColor Green
}

Wenn die Ordner Dateien enthalten, können Sie alle Elemente mit dem nächsten Befehl iterieren:

$web = Get-PnPWeb

Get-PnPListItem -List $path -FolderServerRelativeUrl "$($web.ServerRelativeUrl)" -Query "<View><Query><Where><IsNotNull><FieldRef Name='Title' /></IsNotNull></Where> </Query></View>"

Die PnP- PowerShell-Befehle arbeiten zusammen, um sicherzustellen, dass Elemente wie Verbindungen, Kontext und sogar die aktuellen Sites wiederverwendet werden.

Hochladen von Dateien in SharePoint Online

Das Verschieben von Inhalten aus Dateifreigaben oder lokalen Speicherplattformen in einen Microsoft-365-Dienst wie SharePoint Online verlangt häufig den Kauf von Migrations-Tools und -anwendungen. Diese Produkte funktionieren in der Regel gut – Sie können sich die Ausgabe aber mitunter sparen, indem Sie das PnP-PowerShell-Modul nutzen.

In diesem Beispiel haben wir einen Ordner mit verschiedenen Microsoft-Office-Dateien, wie PowerPoint-, Word- und Excel-Dateien, die wir an einen bestimmten Speicherort in SharePoint Online hochladen möchten.

Das folgende Skript stellt eine Verbindung mit der erforderlichen SharePoint-Online-Seite her und fügt die Dateien dann an dem von uns angegebenen Speicherort hinzu:

Connect-PnPOnline "https://{Tenant}.sharepoint.com/sites/Demo/DemoSubsite" -Credentials $creds
$folder = "/Shared Documents"
$localpath = "D:\Documents"
$files = Get-ChildItem -Path $localpath –Recurse

foreach($file in $files)
{
  Add-PnPFile -Path "$($localpath)\$($file.Name)" -Folder "$($web.ServerRelativeUrl)$($folder)"
}

Sind die Dateien hochgeladen, sehen Sie, dass nur das Feld Name aktualisiert wurde, während das Feld Titel leer ist. Dies sollten Sie anpassen. Verwenden Sie PowerShell, um das Titelfeld mit dem folgenden Code zu aktualisieren:

Connect-PnPOnline "https://{Tenant}.sharepoint.com/sites/Demo/DemoSubsite" -Credentials $creds
$folder = "/Shared Documents"
$localpath = "D:\Documents"
$files = Get-ChildItem -Path $localpath –Recurse

foreach($file in $files)
{
  $up = Add-PnPFile -Path "$($localpath)\$($file.Name)" -Folder "$($web.ServerRelativeUrl)$($folder)"
  $item = Get-PnPListItem -List "$($folder)" -UniqueId $up.UniqueId
  Set-PnPListItem -List "$($folder)" -Identity $item.Id -Values @{"Title" = "$($up.Name)"}
}

Häufig ist es notwendig, während eines Migrationsprozesses Dateien zu entfernen und erneut hochzuladen. PnP PowerShell bietet Ihnen eine Möglichkeit, dies mit dem folgenden Code zu tun:

Connect-PnPOnline "https://{Tenant}.sharepoint.com/sites/Demo/DemoSubsite" -Credentials $creds
$folder = "/Shared Documents"

$files = Get-PnPListItem -List $folder -FolderServerRelativeUrl "$($web.ServerRelativeUrl)" -Query "<View><Query><Where><IsNotNull><FieldRef Name='Title' /></IsNotNull></Where></Query></View>"

foreach($file in $files)
{
     Remove-PnPListItem -List "$($folder)" -Identity $file.Id -Force
}

Wie Sie an diesen Beispielen sehen können, ermöglicht Ihnen das PnP-PowerShell-Modul, alle Datei- und Ordneraktionen wie das Hinzufügen, Aktualisieren und Entfernen von Inhalten mit derselben Codestruktur und ohne kompliziertes PowerShell-Skript auszuführen. Für all die komplexe Logik, die in den Cmdlets steckt, ist ihre Verwendung einfach und unkompliziert.

Weitere Informationen zur Verwendung der PnP PowerShell-Modul-Cmdlets finden Sie in der Dokumentation von Microsoft auf der GitHub-Site des Projekts.

Erfahren Sie mehr über Serverbetriebssysteme