Procédure : restaurer le contenu par programmation
Dernière modification : jeudi 4 novembre 2010
S’applique à : SharePoint Foundation 2010
Cette rubrique explique comment créer une application qui restaure un composant de contenu SharePoint Foundation à partir d'une sauvegarde. Cela suppose que vous connaissez les rubriques Vue d’ensemble de la sauvegarde et restauration des données dans SharePoint Foundation et Programmation avec le modèle objet de sauvegarde/restauration de SharePoint Foundation.
Pour restaurer un composant de contenu
Ajoutez une référence à Microsoft.SharePoint dans votre projet Visual Studio et ajoutez des instructions using pour les espaces de noms Microsoft.SharePoint.Administration et Microsoft.SharePoint.Administration.Backup du fichier du code.
Dans la méthode Main, créez un objet SPRestoreSettings en utilisant la méthode statique GetRestoreSettings. Pour le premier paramètre, indiquez le chemin où est stockée la sauvegarde. Pour le deuxième paramètre, spécifiez une version de chaîne d'une des valeurs de SPRestoreMethodType.
SPRestoreSettings settings = SPBackupRestoreSettings.GetRestoreSettings((@"\\Server\WSSBackups", "Overwrite");
Dim settings As SPRestoreSettings = SPBackupRestoreSettings.GetRestoreSettings(("\\Server\WSSBackups", "Overwrite")
Demandez à l'utilisateur de spécifier le composant de contenu à restaurer et attribuez son nom à la propriété IndividualItem. Pour afficher une liste détaillée des noms des composants de votre batterie de serveurs qui étaient inclus dans la dernière sauvegarde complète et qui peuvent être les objets d'opérations de restauration, vous pouvez exécuter la commande stsadm -o restore -showtree au niveau de la ligne de commande du serveur. Pour spécifier un autre package de sauvegarde complète, utilisez le paramètre -backupid. Vous pouvez aussi consulter Opérations > Effectuer une restauration dans l'application Administration centrale. Pour spécifier la batterie de serveurs complète, utilisez le nom « Farm ». (Le fait de choisir la valeur null pour la propriété sélectionne également toute la batterie de serveurs pour la sauvegarde, du moins si vous utilisez IndividualItem dans le reste du code pour identifier par son nom le composant à restaurer. Vous trouverez un exemple d'utilisation de la méthode FindItems() dans l'étape 9.)
Console.Write("Enter name of component to restore (default is whole farm):"); settings.IndividualItem = Console.ReadLine();
Console.Write("Enter name of component to restore (default is whole farm):") settings.IndividualItem = Console.ReadLine()
Si vous souhaitez effectuer la restauration à partir d'une autre sauvegarde que la plus récente, identifiez le package de sauvegarde en affectant son GUID à la propriété BackupId. Un enregistrement de chaque opération de sauvegarde pour un emplacement de sauvegarde particulier est stocké dans spbrtoc.xml à la racine de l'emplacement. Chaque opération de sauvegarde et de restauration est représentée dans le fichier par un élément <SPHistoryObject>. S'il s'agit d'une sauvegarde, l'enfant <IsBackup> de l'élément <SPHistoryObject> a la valeur « True ». L'élément <SPId> de l'élément <SPHistoryObject> contient le GUID de la sauvegarde.
Notes
Pour obtenir grâce à la programmation la liste de toutes les opérations de sauvegarde et de restauration, utilisez la méthode GetHistory(). Celle-ci renvoie un objet SPBackupRestoreHistoryList qui contient les objets SPBackupRestoreHistoryObject. Chacun de ces derniers représente une opération et stocke son GUID dans la propriété SelfId.
settings.BackupId = new Guid("GUID");
settings.BackupId = New Guid("GUID")
Vous pouvez définir l'une ou l'autre des propriétés IsVerbose et UpdateProgress, ou les deux. (Pour plus d'informations sur ces propriétés, voir les rubriques qui les concernent.)
settings.IsVerbose = true; settings.UpdateProgress = 10;
settings.IsVerbose = True settings.UpdateProgress = 10
Au besoin, définissez les propriétés FarmAdminLoginName et FarmAdminLoginPassword().
settings.FarmAdminLoginName = "Bob"; settings.FarmAdminPassword = "7*j2U";
settings.FarmAdminLoginName = "Bob" settings.FarmAdminPassword = "7*j2U"
Créez l'opération de restauration avec la méthode CreateBackupRestore(). (Un objet historique est également créé pour l'opération.)
Guid restore = SPBackupRestoreConsole.CreateBackupRestore(settings);
Dim restore As Guid = SPBackupRestoreConsole.CreateBackupRestore(settings)
Si votre interface utilisateur comporte des utilisateurs, tapez un nom de composant au lieu d'en sélectionner un dans une liste ; vous devez être sûr que le nom entré correspond exactement à un composant. Ajoutez la ligne suivante à votre méthode Main.
SPBackupRestoreObject node = EnsureUniqueValidComponentName(settings, ref restore);
Dim node As SPBackupRestoreObject = EnsureUniqueValidComponentName(settings, restore)
Ajoutez l'implémentation suivante de votre méthode EnsureUniqueValidComponentName. Utilisez la méthode FindItems() pour récupérer une collection d'objets de contenu dont le nom correspond au nom entré par l'utilisateur. S'il n'existe aucune correspondance, demandez à l'utilisateur de recommencer. S'il y en a plusieurs, invitez l'utilisateur à être plus précis. Si le nom du composant que l'utilisateur a entré est valide et sans ambiguïté, obtenez une référence à l'objet SPBackupRestoreObject qui représente le composant que l'utilisateur souhaite restaurer.
private static SPBackupRestoreObject EnsureUniqueValidComponentName(SPBackupRestoreSettings settings, ref Guid operationGUID) { SPBackupRestoreObjectCollection list = SPBackupRestoreConsole.FindItems(operationGUID, settings.IndividualItem); SPBackupRestoreObject component = null; if (list.Count <= 0) { Console.WriteLine("There is no component with that name. Run again with a new name."); Console.WriteLine("Press Enter to continue."); Console.ReadLine(); } else if (list.Count > 1) // The component name specified is ambiguous. Prompt user to be more specific. { Console.WriteLine("More than one component matches the name you entered."); Console.WriteLine("Run again with one of the following:"); for (int i = 0; i < list.Count; i++) { Console.WriteLine("\t{0}", list[i].ToString()); } Console.WriteLine("Press Enter to continue."); Console.ReadLine(); } else { component = list[0]; } return component; }
Private Shared Function EnsureUniqueValidComponentName(ByVal settings As SPBackupRestoreSettings, ByRef operationGUID As Guid) As SPBackupRestoreObject Dim list As SPBackupRestoreObjectCollection = SPBackupRestoreConsole.FindItems(operationGUID, settings.IndividualItem) Dim component As SPBackupRestoreObject = Nothing If list.Count <= 0 Then Console.WriteLine("There is no component with that name. Run again with a new name.") Console.WriteLine("Press Enter to continue.") Console.ReadLine() ElseIf list.Count > 1 Then ' The component name specified is ambiguous. Prompt user to be more specific. Console.WriteLine("More than one component matches the name you entered.") Console.WriteLine("Run again with one of the following:") For i As Integer = 0 To list.Count - 1 Console.WriteLine(vbTab & "{0}", list(i).ToString()) Next i Console.WriteLine("Press Enter to continue.") Console.ReadLine() Else component = list(0) End If Return component End Function
Dans la méthode Main, créez une structure conditionnelle qui ne s'exécute que si votre méthode EnsureUniqueValidComponentName a renvoyé un nœud valide.
if (node != null) { // TODO: Set the restore operation as the active operation // and run it. }
If node IsNot Nothing Then ' TODO: Set the restore operation as the active operation ' and run it. End If
Remplacez la ligne « TODO » de l'étape précédente par le code suivant. Cela définit l'opération comme étant l'opération active avec la méthode SetActive() et vérifie son succès. En cas d'échec, ce qui se produit si une autre opération de sauvegarde ou de restauration est déjà en cours d'exécution, une erreur est signalée sur l'interface utilisateur de votre application.
if (SPBackupRestoreConsole.SetActive(restore) == true) { // TODO: Run the operation. See next step. } else { // Report through your UI that another backup // or restore operation is underway. Console.WriteLine("Another backup or restore operation is already underway. Try again when it ends."); }
If SPBackupRestoreConsole.SetActive(restore) = True Then ' TODO: Run the operation. See next step. Else ' Report through your UI that another backup ' or restore operation is underway. Console.WriteLine("Another backup or restore operation is already underway. Try again when it ends.") End If
Dans la branche de code qui s'exécute en cas de succès de l'appel SetActive(), l'opération est exécutée avec la méthode Run(). Vérifiez que l'opération réussit. En cas d'échec, un message signalant l'échec de l'opération s'affiche sur votre interface utilisateur. Le code suivant remplace la ligne « TODO » de l'étape précédente.
if (SPBackupRestoreConsole.Run(restore, node) == false) { // Report "error" through your UI. String error = SPBackupRestoreConsole.Get(restore).FailureMessage; Console.WriteLine(error); }
If SPBackupRestoreConsole.Run(restore, node) = False Then ' Report "error" through your UI. Dim [error] As String = SPBackupRestoreConsole.Get(restore).FailureMessage Console.WriteLine([error]) End If
Nettoyez la restauration avec la méthode Remove(). Ajoutez le code suivant juste avant l'accolade fermante que vous avez insérée à l'étape 10.
// Clean up the operation. SPBackupRestoreConsole.Remove(restore); Console.WriteLine("Restore attempt complete. Press Enter to continue."); Console.ReadLine();
' Clean up the operation. SPBackupRestoreConsole.Remove(restore) Console.WriteLine("Restore attempt complete. Press Enter to continue.") Console.ReadLine()
Exemple
Le code suivant indique comment programmer la restauration d'un composant de contenu. Remplacez l'espace réservé \\Server\WSSBackups par le chemin d'accès à l'emplacement de votre sauvegarde. L'exécutable y trouve automatiquement la sauvegarde la plus récente.
using System;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.Administration.Backup;
namespace MyCompany.SharePoint.Administration.Backup
{
class Restore
{
static void Main(string[] args)
{
// Create the restore settings.
SPRestoreSettings settings = SPBackupRestoreSettings.GetRestoreSettings(@"\\Server\WSSBackups", "Overwrite");
// Identify the content component to restore.
Console.Write("Enter name of component to restore (default is whole farm):");
settings.IndividualItem = Console.ReadLine();
// Set optional operation parameters.
settings.IsVerbose = true;
settings.UpdateProgress = 10;
// Create the restore operation and return its ID.
Guid restore = SPBackupRestoreConsole.CreateBackupRestore(settings);
SPBackupRestoreObject node = EnsureUniqueValidComponentName(settings, ref restore);
if (node != null)
{
// Set the restore as the active job and run it.
if (SPBackupRestoreConsole.SetActive(restore) == true)
{
if (SPBackupRestoreConsole.Run(restore, node) == false)
{
// Report "error" through your UI.
String error = SPBackupRestoreConsole.Get(restore).FailureMessage;
Console.WriteLine(error);
}
}
else
{
// Report through your UI that another backup
// or restore operation is underway.
Console.WriteLine("Another backup or restore operation is already underway. Try again when it ends.");
}
// Clean up the operation.
SPBackupRestoreConsole.Remove(restore);
Console.WriteLine("Restore attempt complete. Press Enter to continue.");
Console.ReadLine();
}
}// end Main
private static SPBackupRestoreObject EnsureUniqueValidComponentName(SPBackupRestoreSettings settings, ref Guid operationGUID)
{
SPBackupRestoreObjectCollection list = SPBackupRestoreConsole.FindItems(operationGUID, settings.IndividualItem);
SPBackupRestoreObject component = null;
if (list.Count <= 0)
{
Console.WriteLine("There is no component with that name. Run again with a new name.");
Console.WriteLine("Press Enter to continue.");
Console.ReadLine();
}
else if (list.Count > 1) // The component name specified is ambiguous. Prompt user to be more specific.
{
Console.WriteLine("More than one component matches the name you entered.");
Console.WriteLine("Run again with one of the following:");
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine("\t{0}", list[i].ToString());
}
Console.WriteLine("Press Enter to continue.");
Console.ReadLine();
}
else
{
component = list[0];
}
return component;
}// end EnsureUniqueValidComponentName
}// end Restore class
}// end namespace
Imports System
Imports Microsoft.SharePoint.Administration
Imports Microsoft.SharePoint.Administration.Backup
Namespace MyCompany.SharePoint.Administration.Backup
Friend Class Restore
Shared Sub Main(ByVal args() As String)
' Create the restore settings.
Dim settings As SPRestoreSettings = SPBackupRestoreSettings.GetRestoreSettings("\\Server\WSSBackups", "Overwrite")
' Identify the content component to restore.
Console.Write("Enter name of component to restore (default is whole farm):")
settings.IndividualItem = Console.ReadLine()
' Set optional operation parameters.
settings.IsVerbose = True
settings.UpdateProgress = 10
' Create the restore operation and return its ID.
Dim restore As Guid = SPBackupRestoreConsole.CreateBackupRestore(settings)
Dim node As SPBackupRestoreObject = EnsureUniqueValidComponentName(settings, restore)
If node IsNot Nothing Then
' Set the restore as the active job and run it.
If SPBackupRestoreConsole.SetActive(restore) = True Then
If SPBackupRestoreConsole.Run(restore, node) = False Then
' Report "error" through your UI.
Dim [error] As String = SPBackupRestoreConsole.Get(restore).FailureMessage
Console.WriteLine([error])
End If
Else
' Report through your UI that another backup
' or restore operation is underway.
Console.WriteLine("Another backup or restore operation is already underway. Try again when it ends.")
End If
' Clean up the operation.
SPBackupRestoreConsole.Remove(restore)
Console.WriteLine("Restore attempt complete. Press Enter to continue.")
Console.ReadLine()
End If
End Sub ' end Main
Private Shared Function EnsureUniqueValidComponentName(ByVal settings As SPBackupRestoreSettings, ByRef operationGUID As Guid) As SPBackupRestoreObject
Dim list As SPBackupRestoreObjectCollection = SPBackupRestoreConsole.FindItems(operationGUID, settings.IndividualItem)
Dim component As SPBackupRestoreObject = Nothing
If list.Count <= 0 Then
Console.WriteLine("There is no component with that name. Run again with a new name.")
Console.WriteLine("Press Enter to continue.")
Console.ReadLine()
ElseIf list.Count > 1 Then ' The component name specified is ambiguous. Prompt user to be more specific.
Console.WriteLine("More than one component matches the name you entered.")
Console.WriteLine("Run again with one of the following:")
For i As Integer = 0 To list.Count - 1
Console.WriteLine(vbTab & "{0}", list(i).ToString())
Next i
Console.WriteLine("Press Enter to continue.")
Console.ReadLine()
Else
component = list(0)
End If
Return component
End Function ' end EnsureUniqueValidComponentName
End Class ' end Restore class
End Namespace ' end namespace
Voir aussi
Tâches
Pocédure : sauvegarder du contenu par programme
Procédure : sauvegarder et restaurer une seule collection de sites par programmation
Procédure : créer une classe de contenu qui peut être sauvegardée et restaurée
Procédure : étendre l'utilitaire STSADM
Référence
Microsoft.SharePoint.Administration.Backup
Concepts
Programmation avec le modèle objet de sauvegarde/restauration de SharePoint Foundation