{"id":1964,"date":"2017-06-29T14:38:02","date_gmt":"2017-06-29T12:38:02","guid":{"rendered":"https:\/\/www.langlitz-it.de\/?p=1964"},"modified":"2017-08-10T12:40:51","modified_gmt":"2017-08-10T10:40:51","slug":"powershell-sharepoint-dateien-extrahieren","status":"publish","type":"post","link":"https:\/\/www.langlitz-it.de\/?p=1964","title":{"rendered":"PowerShell &#8211; SharePoint &#8211; Dateien extrahieren"},"content":{"rendered":"<p>Dateien, die in SharePoint Bibliotheken abgelegt werden, sind als <em>BLOBs<\/em>\u00a0<em>(Binary Large Objects)<\/em>\u00a0in 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\u00e4hlige Backup Tools, mit denen so etwas zu realisieren ist. Ich m\u00f6chte hier aber lieber auf die M\u00f6glichkeit eingehen, eine solche Datei mit der <em>Powershell<\/em> aus der Datenbank zu extrahieren.<\/p>\n<p>Zun\u00e4chst sehen wir mal, welche Dateien in den <em>Document Libraries<\/em> einer <em>Site Collection<\/em> \u00fcberhaupt vorhanden sind. Dazu dient folgendes PowerShell Script, welches zun\u00e4chst alle <em>Document Libraries<\/em> aus einer <em>Site Collection<\/em> 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.<\/p>\n<pre>function GetFileURLs ([string]$root) {\r\n     $sitecol = new-object Microsoft.SharePoint.Publishing.PublishingSite($root)\r\n     $sitecol.Site.allwebs | foreach {\r\n          $Url = $_.url\r\n          $_.Lists | Where-Object {$_.BaseType -eq \"DocumentLibrary\"} | foreach {\r\n               $_.Items | foreach {\r\n                    $Files = $Url + \"\/\" + $_.Url\r\n                    $Files\r\n                    }\r\n               }\r\n          }\r\n     }\r\n\r\n$root = (Get-SPsite \"https:\/\/asgps000100a.sps.asg-whitepark.com\").url\r\nGetFileURLs $root | Out-File Fileurls.txt<\/pre>\n<p>In der Textdatei <em>Fileurls.txt<\/em> finden Sie nun alle Dateien mit Ihrer URL.<\/p>\n<pre>https:\/\/site.sps.langlitz-it.de\/Store1\/PDF\/catalog.pdf\r\nhttps:\/\/site.sps.langlitz-it.de\/Store2\/PIC\/picture.jpg\r\nhttps:\/\/site.sps.langlitz-it.de\/Store3\/Video\/video.mpg\r\n...<\/pre>\n<p>Sie m\u00f6chten das Video extrahieren? Dazu dient das n\u00e4chste Script.<\/p>\n<pre>function GetFile {\r\n     param($dest,$Web)\r\n     $file = $web.GetFile(\"https:\/\/site.sps.langlitz-it.de\/Store3\/Video\/video.mp4\")\r\n     $folder = $dest + \"\/\" + $folder.Url\r\n     $bin = $file.OpenBinary()\r\n     $stream = New-Object System.IO.FileStream($folder + \"\/\" + $file.Name), Create\r\n     $writer = New-Object System.IO.BinaryWriter($stream)\r\n     $writer.write($bin)\r\n     $writer.Close()\r\n     }\r\n\r\n$Web = (Get-SPSite https:\/\/site.sps.langlitz-it.de).RootWeb\r\n$Dest = \"C:\\_Marco\\\"\r\nGetFile $Dest $Web<\/pre>\n<p>Eine Eigenschaft der <em>Objektklasse SPSite<\/em> ist <em>RootWeb<\/em>. <em>RootWeb<\/em> wiederum ist die <em>Objektklasse SPWeb<\/em>. Diese hat die Methode <em>GetFile<\/em>, mit der die gew\u00fcnschte Datei als Objekt geladen werden kann. Dieses stellt die <em>Objektklasse SPFile<\/em> dar.<\/p>\n<p>Die <em>Objektklasse SPFile <\/em>wiederum beinhaltet nun die Methode <em>OpenBinary<\/em>. Damit l\u00e4sst sich die Datei im Bin\u00e4rformat einlesen. Diese Bin\u00e4rdaten werden dann \u00fcber <em>New-Object<\/em> an die Variable <em>$stream<\/em> \u00fcbergeben und von dort aus erneut \u00fcber <em>New-Object<\/em> an die Variable <em>$writer<\/em>. \u00dcber die Methode <em>write<\/em> der <em>Objektklasse BinaryWriter<\/em> werden die Daten dann geschrieben und mit der Methode <em>close<\/em> die Datei geschlossen.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dateien, die in SharePoint Bibliotheken abgelegt werden, sind als BLOBs\u00a0(Binary Large Objects)\u00a0in 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\u00e4hlige Backup Tools, &hellip; <a href=\"https:\/\/www.langlitz-it.de\/?p=1964\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[720,721,719,553,626,724,722,723],"_links":{"self":[{"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/posts\/1964"}],"collection":[{"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1964"}],"version-history":[{"count":17,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/posts\/1964\/revisions"}],"predecessor-version":[{"id":1991,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=\/wp\/v2\/posts\/1964\/revisions\/1991"}],"wp:attachment":[{"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1964"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1964"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.langlitz-it.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}