27. Mai 2015 · von Steffen Nörtershäuser

Erklärt: Powershell File Upload für Office365

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.



Diesen Blogeintrag bewerten:

4 Stimmen mit durchschnittlich 3.3/5 Punkten

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!


Kommentar zu “Erklärt: Powershell File Upload für Office365”

Schreibe einen Kommentar

Kontakt.
Lassen Sie sich von uns beraten
Wir freuen uns über Ihr Interesse an unseren Leistungen. Hinterlassen Sie
uns Ihren Namen, Ihre Telefonnummer und E-Mail Adresse – wir melden
uns schnellstmöglich bei Ihnen.
Kontakt aufnehmen