VSS でのレジストリのバックアップと復元の操作

Windows Registry Service は、レジストリ ライターと呼ばれる VSS ライターをサポートしています。これによりリクエスターは、シャドウ コピーされたボリュームに格納されているデータを使用してシステム レジストリをバックアップできます。 レジストリ ライターの詳細については、インボックス VSSライターに関するページを参照してください。

レジストリ ライターは、レジストリのインプレース バックアップと復元を実行します。 さらに、レジストリ ライターではシステム ハイブのみが報告されます。ユーザー ハイブは報告されません。

Windows Server 2003: レジストリ ライターは、中間リポジトリ ファイル (スピット ファイルとも呼ばれます) を使用してレジストリ データを格納します。 さらに、レジストリ ライターではシステム ハイブとユーザー ハイブが報告されます。

レジストリ ライターのライター ID は、AFBAB4A2-367D-4D15-A586-71DBB18F8485 です。

Windows XP: レジストリ ライターはありません。 レジストリ データは、ライター ID が F2436E37-09F5-41AF-9B2A-4CA2435DBFD5 である Bootable State ライターによって報告されます。

Note

Microsoft は、Windows (すべてのリリース) でのオンライン システム状態の復元の実装に関して、開発者または IT プロフェッショナル向けのテクニカル サポートを提供していません。 

Note

以下の情報は、Windows Server 2003 および Windows XP にのみ適用されます。

 

VSS を使用したレジストリ バックアップ

レジストリ ライターは、アクティブなレジストリ ファイルをエクスポートして、キー HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\hivelist で定義されている場所に保存します。

このレジストリ エントリ以下にある値の名前は、保存するレジストリ ハイブを識別し、値のデータはファイル (hive ファイル) を含むファイルを提供します。 ハイブ ファイルは、\Device\HarddiskVolumeX\path\filename の形式で指定されます。

たとえば、HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\hivelist にあるエントリは、\REGISTRY\MACHINE\SOFTWARE = \Device\HarddiskVolume1\Windows\System32\config\SOFTWARE のように表示されています。

レジストリ ライターでは、シャドウ コピーの前にハイブ ファイルがディスクに保存されます。

レジストリ ハイブをバックアップする際に、リクエスターは \Device\HarddiskVolumeX をボリュームのシャドウ コピーのデバイス オブジェクト文字列に置き換えます。

Note

\Device\HarddiskVolumeX のパスを同等の Win32 パスに変換するには、 QueryDosDevice 関数を使用します。 詳細については、ファイル ハンドルからのファイル名の取得またはボリューム パス名の表示に関するページを参照してください。

 

VSS 以外の Win32 API を使用したレジストリ復元

Note

Windows Server 2016 以降では、レジストリの復元がサポートされていません。

オンライン (セーフ モードまたはフル オペレーティング システム) の復元を行うには、 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations レジストリ キーのサブキーを保持する必要があります。

MoveFileEx および MoveFileTransacted 関数は、このレジストリ キーを使用して、dwFlags パラメーターの MOVEFILE_DELAY_UNTIL_REBOOT 値によって名前が変更されたファイルに関する情報を格納します。

PendingFileRenameOperations レジストリ キーの内容を保持するには、バックアップ アプリケーションで RegLoadKey 関数を呼び出して、復元するレジストリ ファイルをアクティブなレジストリに接続する必要があります。 これによってバックアップ アプリケーションは、さまざまなレジストリ関数を使用して、読み込まれたハイブに、必要なキーと値をコピーできます。 コピーが完了したら、RegFlushKey および RegUnloadKey 関数を呼び出す必要があります。

オフライン (Windows 回復環境または Windows PE) の復元では、 PendingFileRenameOperations レジストリ キーを受け入れる必要はありません。

Windows Server 2003 で VSS 以外の Win32 API を使用したレジストリ復元

Note

以下の情報は、Windows Server 2003 で実行されるディザスター リカバリー (ベア メタル回復とも呼ばれます) に関連する復元操作にのみ適用されます。

 

レジストリを復元する場合、バックアップ アプリケーションは、現在のレジストリのサブキーの一部を復元するレジストリに移動する必要があります。

これを行うには、バックアップ アプリケーションで RegLoadKey を呼び出して、現在アクティブなレジストリに復元するレジストリ ファイルを接続します。 これにより、さまざまなレジストリ関数を使用して、読み込まれたハイブに、必要なキーと値をコピーできます。 コピーが完了すると、RegFlushKey および RegUnloadKey が呼び出されます。

下のレジストリ キーは、復元アプリケーション (リクエスター) に対し、HKEY_LOCAL_MACHINE\SYSTEM 以下のレジストリ キーを復元時に上書きしないことを示しています。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\BackupRestore\KeysNotToRestore

システム状態の復元プロセスには、以前にバックアップされたレジストリの復元が含まれます。

バックアップ アプリケーションでは、HKEY_LOCAL_MACHINE\SYSTEM ハイブを復元する際に特別な注意を払う必要があります。これは、Windows オペレーティング システムの一時バージョンをインストールするプロセスによって、新しくインストールされたシステム ハイブにキーが確立され、その値が復元操作後も保持される必要があるためです。

たとえば、置換後のシステムに元のシステムとは異なるネットワーク インターフェイス カードが搭載されている場合、以前のカードの元のキーを復元すると、予期しない結果が生じます。 これは、プラグ アンド プレイ サービスが適切なサービスとドライバーのレジストリ エントリを検出し、レジストリに配置したためです。 復元後にシステムを正常に起動するには、これらの値を保持する必要があります。

このセクションでは、HKEY_LOCAL_MACHINE\SYSTEM ハイブの復元を実行するときに、保持するキーとファイルをバックアップ アプリケーションで検出する方法について説明します。 場合によっては、新しくインストールされたインストール ハイブから復元するハイブにキーをプログラムでコピーする必要があります。 それ以外の場合、製品のレジストリ キーが置き換えられないようにするには、保持するキーを製品の INF 構成ファイルで指定するだけです。

保持するキー (およびキー データ) は、HKEY_LOCAL_MACHINE\SYSTEM ハイブの

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore\KeysNotToRestore

キー以下に、REG_MULTI_SZ 文字列 (このドキュメントではキー文字列と呼びます) のセットとして列挙されます。

アプリケーションやサービスはいつでも値を追加できるため、バックアップ アプリケーション (リクエスター) は、アクティブなレジストリと新しく復元されたレジストリ内のこれらのキーの値を調べる必要があります。

バックアップ アプリケーションによるキー文字列の解釈方法は、そのアプリケーションの終端文字によって決まります。

  1. 円記号 ('\') で終わるキー文字列は、サブキーとして解釈されます。 このような部分文字列が見つかった場合、バックアップ アプリケーションはすべてのデータとすべての下位キーを保持する必要があります。

    たとえば以下のキー文字列は、復元操作ですべての下位キーとデータの保持が必要であることを指定しています。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\dmio\boot info\

    そのためには、このキーとすべての下位キーとデータを、既存のレジストリ (つまり、Windows のインストールによって作成されたもの) から新しく復元されたレジストリにコピーする必要があります。 これは、キー置換操作と呼ばれます。 この操作により、復元されたレジストリ内の対応するキーが置き換えられます。

  2. 終了文字がアスタリスク ('*') であるキー文字列は、すべてのサブキーをマージすることを指定しています。 たとえば、次のキー文字列:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\*

    は、既存のレジストリ内のサービス キー (Windows のインストールによって作成されたものなど) を復元されたレジストリにマージする必要があることを指定します。 これは キーマージ 操作と呼ばれ、既存のハイブと復元されたハイブの両方にサブキーが存在する場合、復元されたディレクトリ内のキーは、以下の例外を除いて保持されます。

    • 既存のハイブのサブキーに "start" という名前の値が含まれていて、復元されたハイブのサブキーには含まれていない場合。
    • 既存のハイブと復元されたハイブの両方のサブキーに "start" という名前の値が含まれていて、既存のハイブの数値の方が小さい場合。

    レジストリの "start" 値は、サービスまたはドライバーがいつ開始されるかを指定し、有効値は 0 ~ 4 の数値です。 この値が小さいほど、起動プロセスが早くサービスが開始されます。

    このキーが、既存のディレクトリと復元されたディレクトリの両方に存在する場合は、各ハイブの開始キーの値を調べる必要があります。 既存のハイブの値が、復元されたディレクトリの値より小さい場合は、小さい方の値を保持する必要があります。

    前述のように、このキーは、サービスまたはドライバーの開始を、起動時、システム時間、手動、自動のいずれで行うか、または無効にするかを決定するために使用されます。 値が小さいほど開始時刻が早くなります。 次回の起動時にサービスまたはドライバーが適切に開始されるようにするには、新しいレジストリに早い開始時刻を適用する必要があります。

  3. 終端文字が円記号でもアスタリスクでもないキー文字列は、保持するレジストリ値として解釈されます。

    たとえば、次のキー文字列:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

    キーをプログラムで保存できるメカニズムには、Win32 レジストリ API が関与しています。 たとえば、以下では 1 つのアルゴリズムを列挙しています。

    1. バックアップされたシステム ハイブ ファイルをファイルに復元します。 この例では、名前を System.reg とします。

    2. RegLoadKey を使用し、System.reg を一時名で HKEY_LOCAL_MACHINE に読み込みます。 たとえば、次のような名前を使用します。

      HKEY_LOCAL_MACHINE\TMP_SYSTEM

    3. 両方のレジストリ コピーの KeysNotToRestore サブキーの値を列挙し、リストのスーパーセットを作成します。 各キーを既存の

      HKEY_LOCAL_MACHINE\SYSTEM

      キーから

      HKEY_LOCAL_MACHINE\TMP_SYSTEM

      キーに、前述のセマンティクスに従ってコピーします。

    4. 完了したら、RegFlushKey & RegUnloadKey エントリ ポイントを使用して、

      HKEY_LOCAL_MACHINE\TMP_SYSTEM

      キーを System.reg に再び保存します。

    5. 最後に、RegReplaceKey を使用して、System.reg が

      HKEY_LOCAL_MACHINE\SYSTEM

      ハイブ ファイル SYSTEM を置き換えることを指定します。