PowerShell – SharePoint – Dateien extrahieren

Dateien, die in SharePoint Bibliotheken abgelegt werden, sind als BLOBs (Binary Large Objects) in der jeweiligen Datenbank gespeichert. Wenn also eine einzelne Datei aus dieser Datenbank wiederhergestellt oder extrahiert werden soll, ist das relativ aufwendig. Mit Sicherheit gibt es unzählige Backup Tools, mit denen so etwas zu realisieren ist. Ich möchte hier aber lieber auf die Möglichkeit eingehen, eine solche Datei mit der Powershell aus der Datenbank zu extrahieren.

Zunächst sehen wir mal, welche Dateien in den Document Libraries einer Site Collection überhaupt vorhanden sind. Dazu dient folgendes PowerShell Script, welches zunächst alle Document Libraries aus einer Site Collection ermittelt und in diesen dann nach den dort abgelegten Dateien sucht. Das Ergebnis (die URLs der Dateien) wird dann als Liste in einer Textdatei gespeichert.

function GetFileURLs ([string]$root) {
     $sitecol = new-object Microsoft.SharePoint.Publishing.PublishingSite($root)
     $sitecol.Site.allwebs | foreach {
          $Url = $_.url
          $_.Lists | Where-Object {$_.BaseType -eq "DocumentLibrary"} | foreach {
               $_.Items | foreach {
                    $Files = $Url + "/" + $_.Url
                    $Files
                    }
               }
          }
     }

$root = (Get-SPsite "https://asgps000100a.sps.asg-whitepark.com").url
GetFileURLs $root | Out-File Fileurls.txt

In der Textdatei Fileurls.txt finden Sie nun alle Dateien mit Ihrer URL.

https://site.sps.langlitz-it.de/Store1/PDF/catalog.pdf
https://site.sps.langlitz-it.de/Store2/PIC/picture.jpg
https://site.sps.langlitz-it.de/Store3/Video/video.mpg
...

Sie möchten das Video extrahieren? Dazu dient das nächste Script.

function GetFile {
     param($dest,$Web)
     $file = $web.GetFile("https://site.sps.langlitz-it.de/Store3/Video/video.mp4")
     $folder = $dest + "/" + $folder.Url
     $bin = $file.OpenBinary()
     $stream = New-Object System.IO.FileStream($folder + "/" + $file.Name), Create
     $writer = New-Object System.IO.BinaryWriter($stream)
     $writer.write($bin)
     $writer.Close()
     }

$Web = (Get-SPSite https://site.sps.langlitz-it.de).RootWeb
$Dest = "C:\_Marco\"
GetFile $Dest $Web

Eine Eigenschaft der Objektklasse SPSite ist RootWeb. RootWeb wiederum ist die Objektklasse SPWeb. Diese hat die Methode GetFile, mit der die gewünschte Datei als Objekt geladen werden kann. Dieses stellt die Objektklasse SPFile dar.

Die Objektklasse SPFile wiederum beinhaltet nun die Methode OpenBinary. Damit lässt sich die Datei im Binärformat einlesen. Diese Binärdaten werden dann über New-Object an die Variable $stream übergeben und von dort aus erneut über New-Object an die Variable $writer. Über die Methode write der Objektklasse BinaryWriter werden die Daten dann geschrieben und mit der Methode close die Datei geschlossen.

 

Leave a Reply

Your email address will not be published.

Time limit is exhausted. Please reload the CAPTCHA.