[Office 365] Sauvegarder et restaurer un site SharePoint grâce aux Web Services

On a beau dire que le cloud est fiable et sécurisé, si je dois y confier mes données, j’aime avoir la certitude que mes données peuvent être sauvegardées et restaurées à volonté. Il en va de même avec SharePoint.

Mon client actuel souhaite migrer son SharePoint 2010 on premises vers un Office 365. Rien de spécial, jusque là, sauf que ce client est aussi un gros utilisateur de bases Access Services avec des données critiques. Les corruptions de données arrivent rarement mais elles font assez mal quand elles arrivent et j’en ais justement eu une sur une de ces bases Access Services. Sans difficulté, le SharePoint étant sauvegardé par DPM 2010, la restauration de la base récalcitrante a été immédiate. Je me suis alors mis à rechercher un moyen de sauvegarder (notamment) ces sites dans le cloud.

SharePoint Designer 2007 proposait de sauvegarder et restaurer des sites SharePoint ce qui correspond presque à ce que je souhaite à ça de près que :

  • SharePoint Designer 2010 ne le propose plus
  • Il faudrait que ce processus soit automatisable

Comprendre comment ça marche

Pour faire des tests et, ayant la flemme de provisionner une VM SharePoint 2007 sur mon portable, j’ai profité de l’opportunité pour essayer de le faire dans un VM Role Azure. Mission réussie, mon général ! Non seulement ça fonctionne à merveille mais on bénéficie de performances de folies.

J’ai alors utilisé notre bon ami Fiddler pour monitorer ce qui se passe quand on sauvegarde un site avec SharePoint Designer :

image

Un premier appel à sites.asmx et à la méthode ExportWeb crée un fichier d’export (.cmp) contenant toutes les données du site exporté et un fichier de rapport/contrôle (.snt). Ces fichiers sont stockés dans SharePoint puis, comme l’export est asynchrone, plusieurs appels vont “pinger” le fichier de rapport pour déterminer si la création est terminée et, si c’est le cas, récupérer le fichier pour le stocker localement.

Mettre les mains de le cambouie

L’API existant toujours dans SharePoint 2010 (et donc Office 365) on peut continuer l’utiliser.

Pour accéder aux Web Services comme au Client Object Model, il faut déjà passer la barrière de l’authentification. Je me baserai sur l’authentification  “headless” (silentieuse) en utilisant le code du post suivant :

http://blogs.msdn.com/b/cjohnson/archive/2011/05/14/part-2-headless-authentication-with-sharepoint-online-and-the-client-side-object-model.aspx

Une fois le sample ouvert, la première chose à faire est de rajouter une référence aux Web Service sites.asmx.

image

L’initialisation de l’authentification se fait grâce au code suivant :

string cmdSpoSite = args[0];
string cmdUserName = args[1];
string cmdPassword = args[2];

helper = new MsOnlineClaimsHelper(
            cmdUserName,
            cmdPassword, 
            cmdSpoSite);

Ici, l’adresse du site, le compte et le mot de passe sont passés en paramètres de l’application.

Ce helper nous permettra d’obtenir les cookies nécessaires à passer au proxy Web Service. J’ai modifié très légerement le sample MSDN pour retourner les cookies par une propriété. On instancie ensuite le proxy Web Service et on lui assigne les cookies d’Office 365 :

SitesProxy.Sites client = new SitesProxy.Sites();
client.CookieContainer = helper.CookieContainer;

Tous les appels de méthodes seront authentifiés avec le compte spécifié plus haut.

Maintenant, sauvegardons une base Access Services nommé “Contacts” dans la bibliothèque “Documents partagés” du site parent grâce au code suivant :

string exportJobName = "export_" + Guid.NewGuid().ToString();

int exportResult = client.ExportWeb(exportJobName,
    "https://toto.sharepoint.com/Contacts" /* Web Url */,
    "https://toto.sharepoint.com/Documents partages" /* Data Path*/,
    true /* Include Subwebs */,
    true /* Include Security */,
    true /* Overwrite */,
    0);
Console.WriteLine("Backup result: " + exportResult);

Les paramètres sont assez simples :

  • Le premier paramètre est le “nom du travail”. Il s’agit du nom de base des fichiers .cmp et .snt générés.
  • La premier URL indique ce que l’ont souhaite backuper
  • La seconde où on veut le backuper
  • Si on veut backuper les sous-sites
  • Inclure la sécurité
  • Ecraser les fichiers s’ils existent déjà.

Le paramètre de retour n’aide, par contre, pas beaucoup : il s’agit d’un magic number. En décompilant le Web Services avec Reflector ILSpy on trouvera un enum qui indique les différents statut retournés. Par exemple, si tout se passe bien, la méthode retournera 1 (Pending). 5 signifiera NoFileAccess : soit le compte n’a pas les droits, soit l’endroit spécifié n’existe pas.

 

Pour restaurer notre site, rien de plus simple :

string importJobName = "import_" + Guid.NewGuid().ToString();

int importResult = client.ImportWeb(importJobName,
    "https://toto.sharepoint.com/Restauration" /* Web Url*/,
    new[] { "https://toto.sharepoint.com/Documents partages/" + exportJobName + ".cmp" } /* Data Files */,
    "https://toto.sharepoint.com/Documents partages" /* Log Path */,
    true /* Include Security */,
    true /* Override */);
Console.WriteLine("Import result: " + importResult);

Les seules différences que l’on va noter par rapport à la sauvegarde sont :

  • On peut restaurer plusieurs fichiers dans le même site.
  • On doit spécifier un endroit où stocker les “logs” de restauration. Il s’agit simplement d’un fichier .snt qui indiquera le résultat de l’opération.
  • Le site de destination peut ne pas exister (un site sera créé au besoin) mais s’il existe, il doit être de même template que celui du backup.

Voici des exemples de logs :

  • Si on essaie de restaurer un package issu d’un autre template que le site de destination :

12,Error occurred while importing the web https://toto.sharepoint.com/Restauration.
Cannot import site. The exported site is based on the template ACCSRV#0 but the destination site is based on the template STS#1. You can import sites only into sites that are based on same template as the exported site.

  • Si on essaie de restaurer un package invalide :

12,Error occurred while importing the web https://toto.sharepoint.com/Restauration.
Failed to read package file.

image

Et pour aller plus loin ?
On peut bien imaginer une tâche dans un Worker Role Azure ou bien sur un serveur On Premise qui ira sauvegarder les données critiques directement dans SharePoint, dans des blobs Azure…

A l’heure où Microsoft parle de réversibilité des données, ce genre de techniques est un moyen de calmer les craintes lors des migrations.

 

Pierrick

Publié dimanche 19 février 2012 19:32 par Pierrick CATRO-BROUILLET
Classé sous ,
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


Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01