次の方法で共有


バックアップと復元を実行できるコンテンツ クラスを作成する

最終更新日: 2010年5月6日

適用対象: SharePoint Foundation 2010

Microsoft SharePoint Foundation のバックアップおよび復元に含めるカスタム コンテンツ コンポーネントがある場合は、IBackupRestore インターフェイスを実装するクラスを使用して、そのコンポーネントを表す必要があります。このトピックでは、その方法について説明します。また手順の後で、詳細な例を紹介します。コンポーネントが、Service Application Framework を実装する Web サービスの場合は、別の方法で IBackupRestore を実装できます。詳細については、「Service Application Framework のバックアップと復元」を参照してください。

注意

コンポーネントが Microsoft SQL Server の Enterprise Edition または Developer Edition でホストされているデータベースであり、SharePoint Foundation の UI またはオブジェクト モデルを通じてスナップショットから復元する必要がある場合、クラスは IDatabaseSnapshotRestore インターフェイスも実装する必要があります。このインターフェイスを実装する方法の詳細については、「[方法] スナップショットから復元できるデータベース クラスを作成する」を参照してください。

コンポーネントが、ファーム管理者が構成専用のバックアップと復元に含めるかどうかを選択する構成情報から構成されている場合は、「[方法] 構成のみのバックアップと復元に含まれるクラスを作成する」を参照し、該当する場合はその手順を実行します。

SPPersistedObject から派生するクラスを使用する必要はありませんが、コンテンツがデータベースの場合は、SPDatabase または SPContentDatabase から派生するクラスを使用することをお勧めします。この 2 つのクラスはどちらも SPPersistedObject から派生しており、IBackupRestore を実装しています。したがって、IBackupRestore のメンバーの既定の実装を必要に応じて使用できます。

IBackupRestore クラスの型は、必要に応じていくつでも作成できます。また、必要であれば、それらをコンポーネント クラスのツリーとして入れ子にすることもできます。ただし、そうしたツリーの最上位のクラスは、SPPersistedObject オブジェクトから (直接または間接的に) 派生していて、SPFarm の子になっている必要があります。他のカスタム コンテンツ クラスの子になっていないコンテンツ クラスは、SPPersistedObject オブジェクトから (直接または間接的に) 派生していて、SPFarm の子になっている必要があります。

使用するクラスが、既に IBackupRestore オブジェクトを実装している (SPPersistedObject から派生しているかどうかは問いません) クラスから派生している場合に、継承された IBackupRestore メンバーの実装を置き換えるには、次のように、クラス宣言で IBackupRestore を明示的に参照する必要があります。

[GUID("9573FAD9-ED89-45E8-BD8B-6A5034E03895")]
public class MyClass : SPPersistedObject, IBackupRestore
<System.Runtime.InteropServices.Guid("9573FAD9-ED89-45E8-BD8B-6A5034E03895")>
Public Class [MyClass]
    Inherits SPPersistedObject
    Implements IBackupRestore

End Class

注意

直接または間接的に SPPersistedObject から継承しているカスタム クラスでは、GuidAttribute がその宣言に適用されている必要があります。

IBackupRestore メンバーの "オーバーライド" では、メンバー名に "IBackupRestore" を明示的に含める必要があるほか、public キーワードを含めないようにする必要もあります。次に例を示します。

UInt64 IBackupRestore.DiskSizeRequired { ... }
Public ReadOnly Property DiskSizeRequired As UInt64 Implements IBackupRestore.DiskSizeRequired
    Get
        ... 
    End Get
End Property

また、親クラスのメンバーの実装で virtual キーワードや override キーワードが使用されている場合は、次のように、実装で override キーワードを使用できます。

public override UInt64 DiskSizeRequired { ... }
Public Overrides ReadOnly Property DiskSizeRequired() As UInt64
    Get
        ...
    End Get
End Property
注意注意

new キーワードを使用するかどうかに関係なく、継承されたメンバーを再宣言して実装を隠さないようにしてください ([new] public UInt64 DiskSizeRequired { ... })。次の手順では、メンバー シグネチャが、既に IBackupRestore を実装しているクラスから派生していないクラスのように記述されています。クラスがそのような親から派生している場合は、シグネチャーを必要なパターンに変更する必要があります。

クラスが SPPersistedObject から派生している場合は、クラスの SPPersistedObject.Id プロパティと SPPersistedObject.Name プロパティを、IBackupRestore.Id プロパティと IBackupRestore.Name プロパティの実装として使用します。これらのプロパティをオーバーライドすることはできますが、2 つ目の実装を作成することはできません。クラスの Name プロパティと Id プロパティは、1 つのみとする必要があります。

IBackupRestore のメンバーを実装するには

  1. Visual Studio で新しいクラス プロジェクトを開始します。

  2. Microsoft.SharePoint への参照を Visual Studio に追加し、Microsoft.SharePoint.Administration 名前空間と Microsoft.SharePoint.Administration.Backup 名前空間の using ステートメントをクラス ファイルに追加します。

  3. クラスが SPPersistedObject から派生していない場合は、Name プロパティを実装します。このプロパティは、stsadm.exe の UI、サーバーの全体管理アプリケーション、およびカスタム バックアップ/復元アプリケーションの UI で、コンテンツ コンポーネントの名前として機能します。ほとんどの場合は、名前の値のためのプライベート フィールドを作成してこのプロパティを実装し、そのフィールドのラッパーとしてパブリック プロパティを実装します。その他の実装方法については、このプロパティのリファレンス トピックを参照してください。

    private String name;
    public String Name
    {
    get {return name;}
    set {name = value;}
    }
    
     Private _name As String
    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property
    
  4. クラスが SPPersistedObject から派生していない場合は、Id プロパティを実装します。ほとんどの場合は、名前の値のためのプライベート フィールドを作成してこのプロパティを実装し、そのフィールドのラッパーとしてパブリック プロパティを実装します。その他の実装方法については、このプロパティのリファレンス トピックを参照してください。

    private Guid id;
    public Guid Id
    {
    get {return id;}
    set {id = value;}
    }
    
    Private _Id As Guid
    Public Property Id() As Guid
        Get
            Return _Id 
        End Get
        Set(ByVal value As Guid)
            _Id = value
        End Set
    End Property
    
  5. DiskSizeRequired プロパティを実装します。クラスがいくつかの子 IBackupRestore クラスを格納するコンテナーにすぎない場合は、このプロパティで 0 を返します。それ以外の場合は、コンテンツのサイズを計算します (IBackupRestore 以外の子オブジェクトのサイズはすべて計算に含めますが、子 IBackupRestore オブジェクトのサイズは計算に含めません。これらのオブジェクトには、それぞれ固有の DiskSizeRequired プロパティがあり、その値が SharePoint Foundation によって自動的に加算されます)。次の例では、FrontEndFilePaths というコレクションにパスが含まれているすべてのファイルのサイズを合計しています。

    public UInt64 DiskSizeRequired
    {
        get 
        {
            UInt64 total = 0;
            List<FileInfo> FrontEndFiles = new List<FileInfo>(NUMBER_OF_FILES_TO_BACK_UP);
    
            foreach (String path in FrontEndFilePaths)
            {
                FileInfo file = new FileInfo(path);
                FrontEndFiles.Add(file);
            }
    
            foreach (FileInfo file in FrontEndFiles)
            {
                total = total + (UInt64)file.Length;
            }
    
            return total;
        }
    } 
    
    Public ReadOnly Property DiskSizeRequired() As UInt64 Implements IBackupRestore.DiskSizeRequired
        Get
            Dim total As UInt64 = 0
            Dim FrontEndFiles As New List(Of FileInfo)(NUMBER_OF_FILES_TO_BACK_UP)
    
            For Each path As String In FrontEndFilePaths
                Dim file As New FileInfo(path)
                FrontEndFiles.Add(file)
            Next path
    
            For Each file As FileInfo In FrontEndFiles
                total = total + CULng(file.Length)
            Next file
    
            Return total
        End Get
    End Property
    
  6. CanSelectForBackup プロパティを実装します。ユーザーがこのクラスのオブジェクトを親オブジェクトと別にバックアップできないようにする場合は、get アクセサーで false を返します。ユーザーがいつでもこのクラスの任意のオブジェクトを選択して単独でバックアップできるようにする場合は、get アクセサーで true を返します。どちらの場合も、set アクセサーは空の中カッコのペア "{ }" にします。親と別にバックアップできるオブジェクトとできないオブジェクトがある場合は、このプロパティをプライベートの Boolean フィールドのラッパーとして実装します。

  7. CanSelectForRestore プロパティを実装します。ユーザーがこのカスタム コンポーネント クラスのオブジェクトを親オブジェクトと別に復元できないようにする場合は、get アクセサーで false を返します。ユーザーがいつでもこのクラスの任意のオブジェクトを選択して単独で復元できるようにする場合は、get アクセサーで true を返します。どちらの場合も、set アクセサーは空の中カッコのペア "{ }" にします。親と別に復元できるオブジェクトとできないオブジェクトがある場合は、このプロパティをプライベートの Boolean フィールドのラッパーとして実装します。

  8. CanRenameOnRestore プロパティを実装します。ユーザーがこのカスタム コンポーネント クラスのオブジェクトを新しい場所に復元できないようにする場合は、get アクセサーで false を返します。ユーザーがこのクラスの任意のオブジェクトを移行できるようにする場合は、get アクセサーで true を返します。このクラスのオブジェクトを移行できるときとできないときがある場合は、このプロパティをプライベートの Boolean フィールドのラッパーとして実装します。

  9. AddBackupObjects(SPBackupRestoreObject) メソッドを実装します。

    1. 実装コードでは、まず最初に、コンポーネントを追加できる有効な親が存在しない場合に例外をスローする必要があります。

    2. AddChild メソッドを使用して、バックアップ操作や復元操作で処理するオブジェクトのツリーにコンポーネントを追加します。

    3. SetParameter(String, Object) メソッドを使用して、バックアップ/復元アプリケーションの UI で使用できるコンポーネントの型の名前と説明を指定します。

    4. コンポーネントに子 IBackupRestore オブジェクトがある場合は、それらを反復処理して、各子オブジェクトの AddBackupObjects(SPBackupRestoreObject) メソッドを再帰的に呼び出す必要があります。

    5. AddBackupObjects(SPBackupRestoreObject) メソッドの実装に関するその他のヒントについては、このメソッドのリファレンス トピックを参照してください。

    次のコード例は、コンテンツ クラスに子 IBackupRestore オブジェクトの ChildContentCollection があることを前提としています。クラスに複数の型の子コンポーネントがある場合は、型ごとに個別のコレクションを使用して、各コレクションを反復処理できます。

    public void AddBackupObjects(SPBackupRestoreObject parent)
    {
        if (parent == null)
        {
            throw new ArgumentNullException("parent");
        }
    
        SPBackupRestoreObject self = parent.AddChild(this);
        self.Information.SetParameter(SPBackupRestoreObject.SPTypeName, this.GetType());
        self.Information.SetParameter(SPBackupRestoreObject.SPDescription,
        "Description of custom content component");
    
        foreach (ChildContent child in ChildContentCollection)
        {
            IBackupRestore childIBR = child as IBackupRestore;
            childIBR.AddBackupObjects(self);
        }
    }
    
    Public Sub AddBackupObjects(ByVal parent As SPBackupRestoreObject) Implements IBackupRestore.AddBackupObjects
        If parent Is Nothing Then
            Throw New ArgumentNullException("parent")
        End If
    
        Dim self As SPBackupRestoreObject = parent.AddChild(Me)
        self.Information.SetParameter(SPBackupRestoreObject.SPTypeName, Me.GetType())
        self.Information.SetParameter(SPBackupRestoreObject.SPDescription, "Description of custom content component")
    
        For Each child As ChildContent In ChildContentCollection
            Dim childIBR As IBackupRestore = TryCast(child, IBackupRestore)
            childIBR.AddBackupObjects(self)
        Next child
    End Sub
    
  10. OnAbort(Object, SPBackupRestoreInformation) メソッドを実装します。このメソッドでは常に true を返します。ほとんどの場合、ほかには何も行いません。例外については、OnAbort(Object, SPBackupRestoreInformation) のリファレンス トピックを参照してください。

  11. OnPrepareBackup(Object, SPBackupInformation) メソッドを実装します。少なくとも、SetParameter(String, Object) メソッドを使用してコンテンツ オブジェクトの名前を指定する必要があります。それ以外には、一般的な規則はほとんどありません。詳細については、OnPrepareBackup(Object, SPBackupInformation) のリファレンス トピックを参照してください。次の例は、このメソッドの最小限の実装を示しています。通常はこれで十分です。

    public Boolean OnPrepareBackup(Object sender, SPBackupInformation args)
    {
        if (args == null)
        {
            throw new ArgumentNullException("args");
        }
        args.SetParameter(SPBackupRestoreObject.SPName, this.Name);
        return true;
    }
    
    Public Function OnPrepareBackup(ByVal sender As Object, ByVal args As SPBackupInformation) As Boolean implements IBackupRestore.OnPrepareBackup 
        If args Is Nothing Then
            Throw New ArgumentNullException("args")
        End If
        args.SetParameter(SPBackupRestoreObject.SPName, Me.Name)
        Return True
    End Function
    
  12. OnBackup(Object, SPBackupInformation) メソッドを実装します。コンテンツ クラスに IBackupRestore 子オブジェクト以外のコンテンツがない場合は、CurrentProgress を単純に、OnBackup(Object, SPBackupInformation) メソッドと OnPrepareBackup(Object, SPBackupInformation) メソッドによってバックアップ操作の合計時間の何パーセントくらいが消費されたかを表す値に設定します。それから、次の例のように true を返します。IBackupRestore 子オブジェクトの OnBackup メソッドは呼び出さないください。

    public Boolean OnBackup(Object sender, SPBackupInformation args)
    {
        if (args == null)
        {
            throw new ArgumentNullException("args");
        }
        args.CurrentProgress = 50;
        return true;
    }
    
    Public Function OnBackup(ByVal sender As Object, ByVal args As SPBackupInformation) As Boolean implements IBackupRestore.OnBackup 
        If args Is Nothing Then
            Throw New ArgumentNullException("args")
        End If
        args.CurrentProgress = 50
        Return True
    End Function
    

    クラスに IBackupRestore 子オブジェクト以外のコンテンツがある場合は、そのコンテンツを args.Location にコピーし、コピーが失敗した場合は false を返す必要があります。IBackupRestore を実装していないすべての子オブジェクトをバックアップするロジックを含める必要がありますが、IBackupRestore を実装している子オブジェクトは、明示的にバックアップしないでください。それらの子オブジェクトは、ランタイムによって呼び出されるそれぞれの OnBackup(Object, SPBackupInformation) メソッドによってバックアップされます。子オブジェクトの OnBackup(Object, SPBackupInformation) メソッドはコードで呼び出さないようにする必要があります。次の例は、OnBackup(Object, SPBackupInformation) の基本的な実装について全体的な構造を示しています。

    public Boolean OnBackup(Object sender, SPBackupInformation args)
    {
        if (args == null)
        {
            throw new ArgumentNullException("args");
        }
        args.CurrentProgress = 50;
        Boolean successSignal = true;
    
        // TODO: Implement copying your content to args.Location
        //       If the copy fails, set successSignal to false.
    
        return successSignal;
    }
    
    Public Function OnBackup(ByVal sender As Object, ByVal args As SPBackupInformation) As Boolean implements IBackupRestore.OnBackup 
        If args Is Nothing Then
            Throw New ArgumentNullException("args")
        End If
        args.CurrentProgress = 50
        Dim successSignal As Boolean = True
    
        ' TODO: Implement copying your content to args.Location
        '       If the copy fails, set successSignal to false.
    
        Return successSignal
    End Function
    
  13. OnBackupComplete(Object, SPBackupInformation) メソッドを実装します。少なくとも、次の例のように、CurrentProgress を 100% に設定し、true を返す必要があります。通常はこれで十分です。実行する必要がある可能性があるその他の処理については、OnBackupComplete のリファレンス トピックを参照してください。

    public Boolean OnBackupComplete(Object sender, SPBackupInformation args)
    {
        if (args == null)
        {
            throw new ArgumentNullException("args");
        }
        args.CurrentProgress = 100;
        return true;
    }
    
    Public Function OnBackupComplete(ByVal sender As Object, ByVal args As SPBackupInformation) As Boolean implements IBackupRestore.OnBackupComplete 
        If args Is Nothing Then
            Throw New ArgumentNullException("args")
        End If
        args.CurrentProgress = 100
        Return True
    End Function
    
  14. OnPreRestore メソッドを実装します。ほとんどの場合、復元操作に準備は必要ないため、OnPreRestore の実装では true を返すだけです。実行する必要がある可能性があるその他の処理については、OnPreRestore のリファレンス トピックを参照してください。

  15. OnRestore メソッドを実装します。

    • コンテンツ クラスが移行可能な場合は、コードで復元方法をチェックして、New だった場合に Rename() を呼び出す必要があります。

    • コンテンツ クラスに IBackupRestore 子オブジェクト以外のコンテンツがない場合は、CurrentProgress を単純に、OnRestore メソッドと OnPreRestore メソッドによって復元操作の合計時間の何パーセントくらいが消費されたかを表す値に設定します。それから、次の例のように true を返します。IBackupRestore 子オブジェクトの OnRestore メソッドは呼び出さないでください。

    public Boolean OnRestore(Object sender, SPRestoreInformation args)
    {
        if (args == null)
        {
            throw new ArgumentNullException("args");
        }
        if (args.RestoreMethod == SPRestoreMethodType.New)
        {
            args.Rename();
        }
        args.CurrentProgress = 50;
        return true;
    }
    
    Public Function OnRestore(ByVal sender As Object, ByVal args As SPRestoreInformation) As Boolean implements IBackupRestore.OnRestore 
        If args Is Nothing Then
            Throw New ArgumentNullException("args")
        End If
        If args.RestoreMethod = SPRestoreMethodType.New Then
            args.Rename()
        End If
        args.CurrentProgress = 50
        Return True
    End Function
    
    • クラスに IBackupRestore 子オブジェクト以外のコンテンツがある場合は、そのコンテンツを復元先にコピーする必要があります。何らかの理由でコンテンツのコピーに失敗した場合は、false を返します。

    次の例は、OnRestore の基本的な実装について全体的な構造を示しています。

    public Boolean OnRestore(Object sender, SPRestoreInformation args)
    {
        if (args == null)
        {
            throw new ArgumentNullException("args");
        }
        if (args.RestoreMethod == SPRestoreMethodType.New)
        {
            args.Rename();
        }
        args.CurrentProgress = 50;
        Boolean successSignal = true;
    
        // TODO: Implement copying your content to the destination.
        //       If the copy fails, set successSignal to false.
    
        return successSignal;
    }
    
    Public Function OnRestore(ByVal sender As Object, ByVal args As SPRestoreInformation) As Boolean implements IBackupRestore.OnRestore 
        If args Is Nothing Then
            Throw New ArgumentNullException("args")
        End If
        If args.RestoreMethod = SPRestoreMethodType.New Then
            args.Rename()
        End If
        args.CurrentProgress = 50
        Dim successSignal As Boolean = True
    
        ' TODO: Implement copying your content to the destination.
        '       If the copy fails, set successSignal to false.
    
        Return successSignal
    End Function
    
  16. OnPostRestore メソッドを実装します。少なくとも、次の例のように、CurrentProgress を 100% に設定し、true を返す必要があります。通常はこれで十分です。実行する必要がある可能性があるその他の処理については、OnPostRestore のリファレンス トピックを参照してください。

    public Boolean OnPostRestore(Object sender, SPRestoreInformation args)
    {
        if (args == null)
        {
            throw new ArgumentNullException("args");
        }
        args.CurrentProgress = 100;
        return true;
    }
    
    Public Function OnPostRestore(ByVal sender As Object, ByVal args As SPRestoreInformation) As Boolean implements IBackupRestore.OnPostRestore 
        If args Is Nothing Then
            Throw New ArgumentNullException("args")
        End If
        args.CurrentProgress = 100
        Return True
    End Function
    

必要に応じてクラスに他のメンバーを追加する

  1. フィールド、プロパティ、およびヘルパー メソッドを必要に応じて追加して、クラスを完成させます。その際には、以下の点に注意してください。

    • 子コンテンツ オブジェクトを保持するには、フィールドとプロパティを使用します。

    • クラスが SPPersistedObject から派生している場合は、構成データベースに保持するフィールドの宣言の前に、[Persisted] 属性を付ける必要があります。ただし、フィールドをこのようにしてマークできるのは、フィールドの型がプリミティブ型 (文字列、整数、GUID など)、他の SPPersistedObject オブジェクトや SPAutoserializingObject オブジェクト、またはそれらのコレクションの場合だけです。たとえば、クラスの FileInfo フィールドを [Persisted] 属性でマークすることはできません。保持しようとしているデータが保持可能なクラスではない場合は、保持可能なクラスのいずれかを使用します。たとえば、上の DiskSizeRequired プロパティの実装例で想定されているクラスは、ファイル名のコレクションを保持し、実行時にそれらのファイル名を使用して FileInfo オブジェクトの一時コレクションを作成します。

    • クラスで同じ型の子を複数持つことができる場合は、コレクション型またはその他の列挙可能な型のプロパティやフィールドを作成して、特定の型のすべての子のコレクションを保持します。これは、子の型自体が IBackupRestore を実装する場合に特に重要になります。AddBackupObjects(SPBackupRestoreObject) メソッドの実装でそれらの子を反復処理して、それぞれの子の AddBackupObjects(SPBackupRestoreObject) メソッドを呼び出す必要があるからです。詳細については、上の AddBackupObjects(SPBackupRestoreObject) メソッドの実装手順を参照してください。

  2. 必要に応じてフィールドやプロパティを初期化するためのコンストラクターをクラスに追加します。クラスが SPPersistedObject から派生している場合は、少なくとも 1 つのコンストラクターが必要です。そのコンストラクターで、オブジェクトに名前を付けて親に割り当てます。通常、このようなコンストラクターは、少なくとも次の 2 つの引数を受け取ります。

    • コンテンツ オブジェクトの名前になる String 引数。

    • コンテンツ オブジェクトの親を表す SPPersistedObject 引数。

    このコンストラクターは、同じ 2 つの引数を受け取る基本コンストラクターを呼び出す必要があります。次に例を示します。

    public MyContentComponent(String componentName, SPPersistedObject parent, SomeTypesomeOtherArgument, ... ) 
                       : base(componentName, parent)
    {
        somePrivateField = someOtherArgument;
        ...
    }
    
    Public Sub New(ByVal componentName As String, ByVal parent As SPPersistedObject, ByVal someOtherArgument As SomeType, . ByVal .. As )
        MyBase.New(componentName, parent)
        somePrivateField = someOtherArgument
       ...
    End Sub
    

    コンテンツ オブジェクトがカスタム IBackupRestore オブジェクト ツリーの最上位オブジェクトである場合は、親として SPFarm.Local を渡す必要があります。カスタム コンポーネント型が常に最上位オブジェクトである場合は、SPPersistedObject 引数を省略して、基本コンストラクターの呼び出しに SPFarm.Local への参照をハードコーディングします。次に例を示します。

    public MyContentComponent(String componentName, SomeTypesomeOtherArgument, ... ) 
                       : base(componentName, SPFarm.Local)
    {
        somePrivateField = someOtherArgument;
        ...
    }
    
    Public Sub New(ByVal componentName As String, ByVal someOtherArgument As SomeType, . ByVal .. As )
        MyBase.New(componentName, SPFarm.Local)
        somePrivateField = someOtherArgument
       ...
    End Sub
    

    クラスのオブジェクトが常に同じ名前を持つ場合は、String 引数を省略して、基本コンストラクターの呼び出しにその名前をハードコーディングします (特定の型のオブジェクトがすべて同じ名前を持つ場合は、特定の親に対してその型の子が複数存在することはありません。したがって、オブジェクトがファームの子である場合、その型のオブジェクトはファーム全体で 1 つだけになります)。

  3. クラス プロジェクトをコンパイルします。

    注意注意

    アセンブリに厳密な名前を付けて、グローバル アセンブリ キャッシュ (GAC) に配置する必要があります。

クラスのオブジェクトを作成してファームの子にするには

  1. Visual Studio で新しいコンソール アプリケーション プロジェクトを開始します。

  2. カスタム コンポーネント クラスの DLL への参照をプロジェクトに追加します。

  3. Microsoft.SharePoint.Administration の using ステートメントを追加します。

  4. カスタム コンポーネント クラスで使用した名前空間の using ステートメントを追加します (または、同じ名前空間をそのままコンソール アプリケーションで使用します)。

  5. プロジェクトの Main メソッドに、カスタム コンポーネント クラスのコンストラクターの呼び出しを追加します。カスタム型の階層を作成した場合は、最上位クラスのコンストラクターを呼び出します。

  6. 必要に応じて、コンポーネントのコンストラクターの呼び出しの前に、そのコンストラクターのパラメーターを作成するコードを追加します。

  7. コンポーネントのコンストラクターの呼び出しの後に、コンポーネント オブジェクトの Update メソッドを呼び出す必要があります。Main メソッドの内容の例を次に示します。

    MyContentComponent myContentObject = new MyContentComponent("component name", SPFarm.Local);
    myContentObject.Update();
    
    Dim myContentObject As New MyContentComponent("component name", SPFarm.Local)
    myContentObject.Update()
    
  8. アプリケーションをコンパイルして実行します。

  9. サーバーの全体管理アプリケーションで、[サーバー構成の管理] の [バックアップの実行] に移動します。[バックアップの実行] ページに、作成したオブジェクトがファームの子として表示されます。

    注意

    下の「」には、カスタム コンテンツ オブジェクトを作成および削除するためのサンプル コンソール アプリケーションがあります。

開発のアドバイス

ここでは、カスタム コンテンツ クラスの開発に役立つヒントを紹介します。カスタム コンテンツ クラスを開発する際には、オブジェクトを作成してファームに追加するという作業を何度も繰り返すことになるため、これらのヒントが特に有用です。

注意点

  1. 構成データベースからオブジェクトを削除する必要がある場合は、Delete() を使用します。

  2. obj.Update() を呼び出した場合に、obj と同じクラス、Name プロパティ値、および親を持つオブジェクトが既に構成データベースに存在すると、例外がスローされます。そのような場合は、オーバーロードされたバージョンの Update を使用することもできます。

  3. 下の 2 つ目の「」には、構成データベースのカスタム オブジェクトを追加または削除するために使用できるサンプル コンソール アプリケーションがあります。

  4. IBackupRestore クラスを再コンパイルした場合は、必ず iisreset をコマンド ラインで実行してください。サーバーを再起動する必要がある場合もあります。

  5. さまざまな IBackupRestore.On* メソッドで、SPBackupInformation パラメーターまたは SPRestoreInformation パラメーターのどちらかが使用されます。メソッドのメンバーを使用して、デバッグを行うことができます。特に Log メソッドの場合は、便利です。

次のコードは、フロントエンド サーバー上の単一の Web.config ファイルを表すカスタム コンテンツ コンポーネントを実装します。コンストラクターの実装のファイル パスの TestSite という部分を、使用しているテスト サーバーのディレクトリ名に置き換えてください。コンパイル済みアセンブリは、厳密な名前を付けて GAC にインストールする必要があります。

クラス実装の次の例は、コンポーネントをファームの子として登録したり、ファームから削除したりする、単純なコンソール アプリケーションのコードです。

using System;
using System.IO;
using System.Collections.Generic;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.Administration.Backup;

namespace MyCompany.SharePoint.Administration
{
    public class CriticalFiles : SPPersistedObject, IBackupRestore
    {

        public CriticalFiles() { }

        public CriticalFiles(String componentName, SPPersistedObject parent) 
                   : base(componentName, parent)
        {
            String pathOfFile = @"C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS\TestSite\Web.config";
            FrontEndFilePaths.Add(pathOfFile);
        }

        [Persisted]
        private const Int32 NUMBER_OF_FILES_TO_BACK_UP = 1;

        [Persisted]
        private List<String> FrontEndFilePaths = new List<String>(NUMBER_OF_FILES_TO_BACK_UP);

        public Boolean CanSelectForBackup
        {
            get { return true; }
            set { }
        }

        public Boolean CanSelectForRestore
        {
            get { return true; }
            set { }
        }

        public Boolean CanRenameOnRestore
        {
            get { return false; }
        }

        public UInt64 DiskSizeRequired
        {
            get
            {
                UInt64 total = 0;
                List<FileInfo> FrontEndFiles = new List<FileInfo>(NUMBER_OF_FILES_TO_BACK_UP);
                
                foreach (String path in FrontEndFilePaths)
                {
                    FileInfo file = new FileInfo(path);
                    FrontEndFiles.Add(file);
                }
                
                foreach (FileInfo file in FrontEndFiles)
                {
                    total = total + (UInt64)file.Length;
                }
                
                return total;
            }
        }

        public void AddBackupObjects(SPBackupRestoreObject parent)
        {
            if (parent == null)
            {
                throw new ArgumentNullException("parent");
            }

            SPBackupRestoreObject self = parent.AddChild(this);
            self.Information.SetParameter(SPBackupRestoreObject.SPTypeName, this.GetType());
            self.Information.SetParameter(SPBackupRestoreObject.SPDescription, "The critical files on all front end servers.");
        }

        public Boolean OnAbort(Object sender, SPBackupRestoreInformation args)
        {
            return true;
        }

        public Boolean OnPrepareBackup(Object sender, SPBackupInformation args)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }
            args.SetParameter(SPBackupRestoreObject.SPName, this.Name);
            return true;
        }

        public Boolean OnBackup(Object sender, SPBackupInformation args)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }
            
            Boolean successSignal = true;

            foreach (String path in FrontEndFilePaths)
            {
                FileInfo file = new FileInfo(path);
                try
                {
                    String mappedFileName = args.GenerateFileMapping(file.Name);
                    file.CopyTo(args.Location + @"\" + mappedFileName, true);
                    args.Log(SPBackupRestoreLogSeverity.Verbose, "Backed up " + file.Name + " in (" + mappedFileName + ")");
                }
                catch (Exception e)
                {
                    args.Log(SPBackupRestoreLogSeverity.Verbose, file.Name + " not backed up: " + e.Message);
                    successSignal = false;
                }
            }

            args.CurrentProgress = 50;
            return successSignal;
        }

        public Boolean OnBackupComplete(Object sender, SPBackupInformation args)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }
            args.CurrentProgress = 100;
            return true;
        }

        public Boolean OnPreRestore(Object sender, SPRestoreInformation args)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }
            return true;
        }

        public Boolean OnRestore(Object sender, SPRestoreInformation args)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }

            // If the CriticalFiles object was deleted from the farm after it was
            // backed up, restore it to the configuration database.
            CriticalFiles cf = SPFarm.Local.GetChild<CriticalFiles>(this.Name);
            if (cf == null)
            {
                this.Update();
                args.Log(SPBackupRestoreLogSeverity.Verbose, this.Name + " added back to configuration database.");
            }

            Boolean successSignal = true;

            // TODO: The following loop restores files to the local server. If there are 
            //       multiple front end servers, your code must iterate through all of 
            //       SPFarm.Local.Servers and restore the same files to every server whose
            //       Role property is SPServerRole.WebFrontEnd

            foreach (String path in FrontEndFilePaths)
            {
                FileInfo backupCopy = new FileInfo(path);
                String mappedFileName = args.ReverseFileMapping(backupCopy.Name);
                FileInfo file = new FileInfo(args.Location + @"\" + mappedFileName);

                try
                {
                    file.CopyTo(path, true);
                    args.Log(SPBackupRestoreLogSeverity.Verbose, "Restored " + backupCopy.Name);
                }
                catch (Exception e)
                {
                    args.Log(SPBackupRestoreLogSeverity.Verbose, file.Name + " not restored: " + e.Message);
                    successSignal = false;
                }
            }
            
            args.CurrentProgress = 50;
            return successSignal;
        }
        
        public Boolean OnPostRestore(Object sender, SPRestoreInformation args)
        {
            if (args == null)
            {
                throw new ArgumentNullException("args");
            }

            args.CurrentProgress = 100;
            return true;
        }

    }
}
Imports System
Imports System.IO
Imports System.Collections.Generic
Imports Microsoft.SharePoint.Administration
Imports Microsoft.SharePoint.Administration.Backup


Namespace MyCompany.SharePoint.Administration
    Public Class CriticalFiles
        Inherits SPPersistedObject
        Implements IBackupRestore

        Public Sub New()
        End Sub

        Public Sub New(ByVal componentName As String, ByVal parent As SPPersistedObject)
            MyBase.New(componentName, parent)
            Dim pathOfFile As String = "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS\TestSite\Web.config"
            FrontEndFilePaths.Add(pathOfFile)
        End Sub

        <Persisted()>
        Private Const NUMBER_OF_FILES_TO_BACK_UP As Int32 = 1

        <Persisted()>
        Private FrontEndFilePaths As New List(Of String)(NUMBER_OF_FILES_TO_BACK_UP)

        Public Property CanSelectForBackup() As Boolean Implements IBackupRestore.CanSelectForBackup
            Get
                Return True
            End Get
            Set(ByVal value As Boolean)
            End Set
        End Property

        Public Property CanSelectForRestore() As Boolean Implements IBackupRestore.CanSelectForRestore
            Get
                Return True
            End Get
            Set(ByVal value As Boolean)
            End Set
        End Property

        Public ReadOnly Property CanRenameOnRestore() As Boolean Implements IBackupRestore.CanRenameOnRestore
            Get
                Return False
            End Get
        End Property

        Public ReadOnly Property DiskSizeRequired() As UInt64 Implements IBackupRestore.DiskSizeRequired
            Get
                Dim total As UInt64 = 0
                Dim FrontEndFiles As New List(Of FileInfo)(NUMBER_OF_FILES_TO_BACK_UP)

                For Each path As String In FrontEndFilePaths
                    Dim file As New FileInfo(path)
                    FrontEndFiles.Add(file)
                Next path

                For Each file As FileInfo In FrontEndFiles
                    total = total + CULng(file.Length)
                Next file

                Return total
            End Get
        End Property

        Public Sub AddBackupObjects(ByVal parent As SPBackupRestoreObject) Implements IBackupRestore.AddBackupObjects
            If parent Is Nothing Then
                Throw New ArgumentNullException("parent")
            End If

            Dim self As SPBackupRestoreObject = parent.AddChild(Me)
            self.Information.SetParameter(SPBackupRestoreObject.SPTypeName, Me.GetType())
            self.Information.SetParameter(SPBackupRestoreObject.SPDescription, "The critical files on all front end servers.")
        End Sub

        Public Function OnAbort(ByVal sender As Object, ByVal args As SPBackupRestoreInformation) As Boolean Implements IBackupRestore.OnAbort
            Return True
        End Function

        Public Function OnPrepareBackup(ByVal sender As Object, ByVal args As SPBackupInformation) As Boolean Implements IBackupRestore.OnPrepareBackup
            If args Is Nothing Then
                Throw New ArgumentNullException("args")
            End If
            args.SetParameter(SPBackupRestoreObject.SPName, Me.Name)
            Return True
        End Function

        Public Function OnBackup(ByVal sender As Object, ByVal args As SPBackupInformation) As Boolean Implements IBackupRestore.OnBackup
            If args Is Nothing Then
                Throw New ArgumentNullException("args")
            End If

            Dim successSignal As Boolean = True

            For Each path As String In FrontEndFilePaths
                Dim file As New FileInfo(path)
                Try
                    Dim mappedFileName As String = args.GenerateFileMapping(file.Name)
                    file.CopyTo(args.Location & "\" & mappedFileName, True)
                    args.Log(SPBackupRestoreLogSeverity.Verbose, "Backed up " & file.Name & " in (" & mappedFileName & ")")
                Catch e As Exception
                    args.Log(SPBackupRestoreLogSeverity.Verbose, file.Name & " not backed up: " & e.Message)
                    successSignal = False
                End Try
            Next path

            args.CurrentProgress = 50
            Return successSignal
        End Function

        Public Function OnBackupComplete(ByVal sender As Object, ByVal args As SPBackupInformation) As Boolean Implements IBackupRestore.OnBackupComplete
            If args Is Nothing Then
                Throw New ArgumentNullException("args")
            End If
            args.CurrentProgress = 100
            Return True
        End Function

        Public Function OnPreRestore(ByVal sender As Object, ByVal args As SPRestoreInformation) As Boolean
            If args Is Nothing Then
                Throw New ArgumentNullException("args")
            End If
            Return True
        End Function

        Public Function OnRestore(ByVal sender As Object, ByVal args As SPRestoreInformation) As Boolean Implements IBackupRestore.OnRestore
            If args Is Nothing Then
                Throw New ArgumentNullException("args")
            End If

            ' If the CriticalFiles object was deleted from the farm after it was
            ' backed up, restore it to the configuration database.
            Dim cf As CriticalFiles = SPFarm.Local.GetChild(Of CriticalFiles)(Me.Name)
            If cf Is Nothing Then
                Me.Update()
                args.Log(SPBackupRestoreLogSeverity.Verbose, Me.Name & " added back to configuration database.")
            End If

            Dim successSignal As Boolean = True

            ' TODO: The following loop restores files to the local server. If there are 
            '       multiple front end servers, your code must iterate through all of 
            '       SPFarm.Local.Servers and restore the same files to every server whose
            '       Role property is SPServerRole.WebFrontEnd

            For Each path As String In FrontEndFilePaths
                Dim backupCopy As New FileInfo(path)
                Dim mappedFileName As String = args.ReverseFileMapping(backupCopy.Name)
                Dim file As New FileInfo(args.Location & "\" & mappedFileName)

                Try
                    file.CopyTo(path, True)
                    args.Log(SPBackupRestoreLogSeverity.Verbose, "Restored " & backupCopy.Name)
                Catch e As Exception
                    args.Log(SPBackupRestoreLogSeverity.Verbose, file.Name & " not restored: " & e.Message)
                    successSignal = False
                End Try
            Next path

            args.CurrentProgress = 50
            Return successSignal
        End Function

        Public Function OnPostRestore(ByVal sender As Object, ByVal args As SPRestoreInformation) As Boolean Implements IBackupRestore.OnPostRestore
            If args Is Nothing Then
                Throw New ArgumentNullException("args")
            End If

            args.CurrentProgress = 100
            Return True
        End Function

    End Class
End Namespace

以下は、構成データベースのコンテンツ オブジェクトを追加または削除するコンソール アプリケーションです。

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.Administration.Backup;

namespace MyCompany.SharePoint.Administration
{
    class Program 
    {
        static void Main(string[] args)
        {
            CriticalFiles cf = SPFarm.Local.GetChild<CriticalFiles>("Critical Front End Files");
            if (cf == null)
            {
                Console.WriteLine("There is no CriticalFiles object in the configuration database.");
                Console.Write("Enter 'A' to add it. Press Return to do nothing:");
                String response = Console.ReadLine();
                if (response == "A")
                {
                    CriticalFiles myCriticalFiles = new CriticalFiles("Critical Front End Files", SPFarm.Local);
                    myCriticalFiles.Update();
                }
            }
            else
            {
                Console.WriteLine("There is a CriticalFiles object in the configuration database.");
                Console.Write("Enter 'D' to delete it. Press Return to do nothing:");
                String response = Console.ReadLine();
                if (response == "D")
                {
                    cf.Delete();
                }
            }
        }// end Main
    }// end Program
} 
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports Microsoft.SharePoint.Administration
Imports Microsoft.SharePoint.Administration.Backup

Namespace MyCompany.SharePoint.Administration
    Module Program
        Sub Main(ByVal args() As String)
            Dim cf As CriticalFiles = SPFarm.Local.GetChild(Of CriticalFiles)("Critical Front End Files")
            If cf Is Nothing Then
                Console.WriteLine("There is no CriticalFiles object in the configuration database.")
                Console.Write("Enter 'A' to add it. Press Return to do nothing:")
                Dim response As String = Console.ReadLine()
                If response = "A" Then
                    Dim myCriticalFiles As New CriticalFiles("Critical Front End Files", SPFarm.Local)
                    myCriticalFiles.Update()
                End If
            Else
                Console.WriteLine("There is a CriticalFiles object in the configuration database.")
                Console.Write("Enter 'D' to delete it. Press Return to do nothing:")
                Dim response As String = Console.ReadLine()
                If response = "D" Then
                    cf.Delete()
                End If
            End If
        End Sub ' end Main
    End Module  ' end Program
End Namespace

関連項目

タスク

[方法] プログラムを使用してコンテンツをバックアップする

[方法] プログラムを使用してコンテンツを復元する

[方法] プログラムを使用して単一のサイト コレクションのバックアップと復元を行う

[方法] スナップショットから復元できるデータベース クラスを作成する

[方法] 構成のみのバックアップと復元に含まれるクラスを作成する

参照

Microsoft.SharePoint.Administration.Backup

Backup

Restore

概念

SharePoint Foundation のバックアップ/復元オブジェクト モデルを使用したプログラミング