Download files/item via unattached content database in SharePoint 2010

In SharePoint 2010 hebben we de mogelijkheid via de Central Administration website site collecties, sites en lijsten te exporteren, maar wat veel mensen niet weten is dat je via Powershell (en via OM) dit ook kunt doen, en zelfs item level restores kunt uitvoeren.
Deze post bevat een aantal voorbeelden om je op weg te helpen.

Stel ik had een document library (Shared Documents) met de volgende bestanden:

Men verwijdert de site collectie, maar een aantal weken later wil iemand graag de foto Pengu de pinguïn terug. Om het nog erger te maken, deze liefhebber wil graag de voorlaatste versie terug hebben.
Nu kunnen we uiteraard de gehele lijst exporteren en ergens importeren, en dan handmatig het item en versie eruit plukken, maar dat heeft natuurlijk niet de Geek-factor (G-Factor) die wij zoeken J

De echte Geek doet dat natuurlijk via code of powershell, maar hoe?

Eerst zal wat andere voorbeelden laten zien om een en ander duidelijk te maken…

Om te beginnen zetten we de SQL backup terug. Dit is een SharePoint blog post , dus ik ga je niet vervelen met SQL restores.
Vervolgens kan ik met Powershell aan de slag:

Wat je hier ziet is dat ik eerst met de contentdatabase verbind als unattached content database. Vervolgens bekijk ik welke sites erin zitten en maak ik een backup van de root site collection en een export van de blog subsite van diezelfde site collection.

Aangezien ik direct tegen het object model aan het babbelen ben, is het niet meer dan logisch dat ik best wat niveautjes dieper kan. Om te beginnen ga ik een document library exporteren. Normaal gesproken kan je daar Export-SPWeb voor gebruiken, maar ik heb het niet voor elkaar gekregen die te doen tegen een unattached content database. Echter aangezien Export-SPWeb onder water de PRIME API gebruikt, ben ik even in de SDK gedoken en kwam tot de ontdekking dat het wel zou moeten kunnen:

In bovenstaand voorbeeld zoek ik eerst de titel op van de lijsten (gebruik het zonder ? filter om de complete lijst te zien). Deze titel kan je direct gebruiken als index in de SPListCollection van een SPWeb (SPWeb.Lists["Titel"] geeft je het SPList object).
Vervolgens gebruik ik direct de PRIME API om de export van de lijst te verzorgen. De UnattachedContentDatabase property van de SPExportSettings class zorgt ervoor dat onze database wordt gebruikt. Het SPExportObject.Id verwijs ik naar de ID van de lijst verkregen via $db.sites[0].rootweb.lists["Shared Documents"].id. De rest van de settings spreken redelijk voor zich denk ik.
Als je dan vervolgens SPExportSettings.Run() aanroept, wordt de export verzorgt!

Nu we wat meer inzicht hebben in hoe we powershell kunnen gebruiken, gaan we de gevraagde foto van de pinguïn terughalen. Dit doen we als volgt:

Eerst vraag ik alle bestanden op in de rootfolder van de document library, waarna ik via het SPFile object bij de versies van het bestand kom. De OpenBinary() methode op de SPFile class maakt een bytestream, welke ik via Add-Content wegschrijf naar een bestand.

En voila, het resultaat:

 

Zoals je ziet kun je alle kanten op met de unattached content db methode. Het is niet al te lastig hier een powershell functie, console app, of zelfs SharePoint application page van de bakken.

Zo komt item level recovery toch een stukje dichterbij J….