Für eine kleine Reporting Lösung in der Office 365 Cloud benötigten wir bis vor kurzem einige aggregierte Daten aus einer SQL Datenbank. Um hier nicht die Business Connectivity Services konfigurieren zu müssen (falls diese nicht im Abonnement enhalten sind), haben wir auf dem SQL Server JSON-Dateien mit aggregierten Werten erzeugt. Diese regelmäßig erzeugten Dateien werden anschließend per Powershell in die Cloud hochgeladen und dort per JavaScript visualisiert.
Wie dieser File Upload funktioniert werde ich in diesem Beitrag erläutern.
CSOM
Um die Datei in eine SharePoint Dokumenten Bibliothek hochzuladen, nutze ich an dieser Stelle das SharePoint Client-Side Object Model (CSOM). Dieses lässt sich einfach in die PowerShell einbinden und kann als SDK heruntergeladen werden, ohne das ein SharePoint Server auf der Maschine, auf der das Powershell Skript ausgeführt wird, notwendig ist.
Die notwendigen Dlls lassen sich mit folgenden Zeilen in die PowerShell einbinden:
Add-Type -Path ([System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client").location) Add-Type -Path ([System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Client.runtime").location)
Anschließend kann die gesamte Funktionalität des CSOM in der PowerShell genutzt werden.
Verbindung zum SharePoint Server
Mithilfe des CSOM kann man sich nun wie folgt an den SharePoint Server / Office 365 verbinden:
$Context = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL) if($O365) { $Creds = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName, (ConvertTo-SecureString $Password -AsPlainText -Force)) } else { $Creds = New-Object System.Net.NetworkCredential($UserName, (ConvertTo-SecureString $Password -AsPlainText -Force)) } $Context.Credentials = $Creds
Die Variable $SiteUrl muss mit der Url der SharePoint Site gefüllt werden. Für Office 365 sähe dies zum Beispiel wie folgt aus: https://<<OrganizationName>>.sharepoint.com. Anschließend muss unterschieden werden, ob es sich bei den Nutzerdaten um einen Office 365 Nutzer oder einen lokalen SharePoint Nutzer handelt. Hierdurch kann dieses Skript sowohl für Office 365 als auch für einen OnPremise SharePoint Server genutzt werden.
Abfragen des Zielordners
Nachdem eine Verbindung zum Server hergestellt wurde, muss zu Beginn der Ordner ermittelt werden, in den die Datei hochgeladen wird. Dies lässt sich wie folgt bewerkstelligen:
# Doc Liste abfragen $DocLib = $Context.Web.Lists.GetByTitle($DocLibName) $Context.Load($DocLib) $Context.ExecuteQuery() $Context.Load($DocLib.RootFolder) $Context.ExecuteQuery() # Ordner abfragen if(-not $Folder.StartsWith("/") -and -not $Folder.StartsWith("\\")) { $Folder = "/" + $Folder; } if($Folder -eq "/") { $Folder = "" } $Folder = $DocLib.RootFolder.ServerRelativeUrl + $Folder $DestinationFolder = $Context.Web.GetFolderByServerRelativeUrl($Folder)
Hier ist die Variable $DocLibName der Name der Dokumentenbibliothek, in die die Datei hochgeladen wird. Anschließend wird die Url für den SharePoint Ordner aufgebaut. Es wäre hier natürlich auch möglich, dem PowerShell Skript direkt diese Url zu übergeben. Für unsere Anforderungen war es jedoch leichter, diese Url im Skript aufzubauen. Über den Aufruf der GetFolderByServerRelativeUrl-Funktion wird nun der eigentliche Ordner abgefragt.
Hochladen der Datei
Nachdem nun eine Verbindung zum Server hergestellt ist und der Zielordner abgefragt wurde, kann die Datei ohne Probleme in den SharePoint Server hochgeladen werden. Wie vorher auch, möchte ich zuerst ein kleines Snippet zeigen:
# Stream zu Datei öffnen $FileStream = New-Object IO.FileStream($FileName,[System.IO.FileMode]::Open) # Datei Informationen erzeugen $FileCreationInfo = New-Object Microsoft.SharePoint.Client.FileCreationInformation $FileCreationInfo.Overwrite = $True $FileCreationInfo.ContentStream = $FileStream $FileCreationInfo.url = [System.IO.Path]::GetFileName($FileName) # Datei hochladen $Upload = $DestinationFolder.Files.Add($FileCreationInfo) $Context.Load($Upload) $Context.ExecuteQuery() if($Upload.CheckOutType -ne "none") { $Upload.CheckIn("Uploaded by Powershell", [Microsoft.SharePoint.Client.CheckinType]::MajorCheckIn) $Context.Load($Upload) $Context.ExecuteQuery() }
Zu Beginn wird hier ein FileStream für die Datei, die in den SharePoint Server hochgeladen werden soll, geöffnet. Daraufhin wird diese Datei in den SharePoint Server hochgeladen. Dabei ist anzumerken, dass die Datei mitunter erst noch eingecheckt werden muss, da sie sich sonst im ausgecheckten Zustand nach dem Hochladen befindet.
Anschließend steht die Datei wie gewohnt im SharePoint Server zur Verfügung.
Kategorien: Erklärt, SharePoint, Technical
Schlagwörter: Office365, Powershell, SharePoint, SharePoint 2013
Haben Sie Fragen zu diesem Artikel oder brauchen Sie Unterstützung?
Nehmen Sie mit uns Kontakt auf!
Wir unterstützen Sie gerne bei Ihren SharePoint-Vorhaben!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Super Artikel, mehr davon!