[PowerShell] Récupérer les WSP d’une ferme SharePoint

Dans SharePoint, les livrables (WSP) déployés sont stockés dans la base de données de configuration de la ferme. Dans certains cas (perte des livrables, des sources…) on peut avoir besoin de récupérer ces fichiers WSP.

Habituellement, c’est très simple. Il suffit d’itérer sur les objets SPSolution de l’objet SPFarm.Solutions et d’appeler la méthode SaveAs pour récupérer les fichiers en local :

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")

$farm = [Microsoft.SharePoint.Administration.SPFarm]::Local

$farm.Solutions | % { $_.SolutionFile.SaveAs("C:\\" + $_.Name) }

Cependant, j’ai été confronté à un cas où la ferme était endommagée (niveau applicatif) et où c’était très difficile d’en remonter une en réinstallant SharePoint et en attachant les bases.

Une solution fut de faire un peu d’ADO.NET sur la base de configuration de la ferme. Comme dans ce cas on part du postulat que, de toutes façons, la ferme ne redémarrera pas et qu’une réinstallation complète sera faite, on peut s’autoriser de requêter directement en SQL.

Après un peu d’introspection dans la base, j’ai fini par trouver que les binaires sont stockés dans la table Binaries (logique…) mais uniquement avec un guid comme identifiant. Pour retrouver le nom de fichier correspondant à chaque binaire, il faut faire une jointure sur la table Objects.

Les colonnes sont donc Name (chaîne de caractères) et FileImage (tableau d’octets).

Voici le script mettant tout ça en musique :

$sql = new-object System.Data.SqlClient.SqlConnection

$sql.ConnectionString = "Data Source=localhost;Initial Catalog=SharePoint_Config;Integrated Security=True"

 

$sqlcmd = new-object System.Data.SqlClient.SqlCommand

$sqlcmd.Connection = $sql

 

$sqlcmd.CommandText = "SELECT Name, FileImage FROM Objects RIGHT JOIN Binaries ON Objects.Id = Binaries.ObjectId"

$sql.Open()

 

$reader = $sqlcmd.ExecuteReader()

 

while ($reader.Read())

{

    [string]$filename = $reader.GetString(0)

    $bytes = $reader.GetValue(1)

 

    $fs = new-object IO.FileStream("$([Environment]::CurrentDirectory)\$($filename)", [IO.FileMode]::Create)

    $fs.Write($bytes, 0, $bytes.Count)

    $fs.Close()

}

 

$reader.Dispose()

$sql.Close()

 

trap

{

    Write-Error "$($_.Exception.Message)"

    if ($fs -ne $null) { $fs.Close() }

    if ($reader -ne $null) { $reader.Dispose() }

    if ($sql -ne $null) { $sql.Close() }

}

Il ne faut pas abuser de cette possibilité (et ça ne remplace nullement d’avoir des backups ainsi que les sources des WSP) mais, quand notre SharePoint préféré a été piétiné par un dinosaure, c’est toujours bon de pouvoir au moins sauver les meubles Smile.

Publié mardi 5 octobre 2010 14:53 par Pierrick CATRO-BROUILLET
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: [PowerShell] Récupérer les WSP d’une ferme SharePoint @ mardi 5 octobre 2010 16:04

Il est également possible d'utiliser bcp.exe : http://blogs.developpeur.org/kype/archive/2009/04/15/sharepoint-r-cup-rer-le-fichier-wsp-d-ploy-pour-une-solution.aspx :)

Kype

# re: [PowerShell] Récupérer les WSP d’une ferme SharePoint @ mardi 5 octobre 2010 23:26

C'est en effet une autre solution qui a le mérite de n'avoir besoin que d'SQL Server d'installé.

J'avais toutefois besoin, dans mon cas, d'une solution permettant de récupérer toutes les WSP d'une ferme (d'où la jointure dans ma requête).

Powershell simplifie considérablement la vie pour pouvoir se charger de l'export en masse mais ça doit surement être possible de le faire avec bcp.

Pierrick CATRO-BROUILLET


Les 10 derniers blogs postés

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21

- SharePoint : Incompatibilité avec Internet Explorer 10 (IE10) par Blog Technique de Romelard Fabrice le 05-08-2013, 16:29

- AutoSPInstaller pour SharePoint 2013 maintenant disponible en “RTM” par Julien Chable le 05-06-2013, 23:30

- [TFS2010] A la recherche du Shelveset perdu par Blog de Jérémy Jeanson le 05-03-2013, 21:46

- .NET / Debug post-mortem : obtenir le fichier mscordacwks.dll correspondant à un dump quand on n'a plus d'accès direct à ce fichier par CoqBlog le 04-28-2013, 19:57

- [W8] Afficher un graphe par CPU dans le gestionnaire des tâches par Blog de Jérémy Jeanson le 04-28-2013, 17:48

- [WCF] Limiter proprement l’accès à vos ressources serveur par Blog de Jérémy Jeanson le 04-26-2013, 22:59

- Event : Je serai speaker à la Conf’SharePoint par Blog Technique de Romelard Fabrice le 04-26-2013, 12:00