Windows10でVSS(volume shadow copy)を任意のタイミングで取得する方法
2018/04/26
本エントリーの目次
Windows10でVSS(volume shadow copy)を任意のタイミングで取得したい!
Windows Server 2003から使用可能になった便利機能の1つがVSS(volume shadow copy)。
シャドウコピーは簡易的なバックアップのように振る舞います。※1
そのため『あ!間違えてファイルを削除しちゃった…。』なんてときに、簡単にデータを復元できるので、とっても便利ですよね!
※1 厳密にはバックアップとは少し異なります。
ところがこの便利なVSS、Windows 10で任意のタイミングで取得する方法についての情報は、ほとんど見つかりません。
Windows 10の『バックアップと復元 (Windows 7)』機能によりバックアップを取得するタイミングなどで、取得されはします。
ですが任意のタイミングでシャドウコピーを取得したいと思っても、それをスケジューリングするGUIがない。
Windows Serverでは使用可能なシャドウコピーを作成するコマンドが使えないなどの理由から、任意のタイミングでシャドウコピーを取得するのは少し難しいのです。※2
そこで今回は、Windows10でVSS(volume shadow copy)を任意のタイミングで取得したい!という方向けに、その方法をご紹介します!
※2 2017年11月現在のWindows 10では、vssadminの機能が制限されています。
念のため、Windows 10での取得方法を紹介する前に、まずはWindows Server系のOSでの取得方法をご紹介しておきましょう。(Windows 10の取得方法はこちら。)
Windows Serverでシャドウコピーを任意のタイミングで取得する方法
Windows Server系のOSでシャドウコピーを任意のタイミングで取得したい場合、たとえば以下の方法で取得可能です。(Windows Server 2012 R2で動作確認済み。)
GUIで取得する方法
Windows Server 2012 R2ではGUIでの設定により、シャドウコピーを任意のタイミングで取得するようスケジューリング可能です。
これはエクスプローラーで任意のボリュームを右クリックし、『シャドウ コピーの構成』をクリックします。
すると『シャドウ コピー』の設定画面が表示されるので、設定を行いたいボリュームを選択して『設定』→『スケジュール』とクリック。
この画面上で取得したい任意の時間を設定・スケジューリングすることで、シャドウコピーを任意のタイミングで取得できます。
CUIで取得する方法
Windows Server 2012 R2ではCUIで、シャドウコピーを任意のタイミングで取得することも可能です。
これは管理者権限でコマンド プロンプトかPowerShellを起動し、『vssadmin』コマンドを実行して取得します。
参考:Windows アプリケーションを管理者権限で起動・実行する方法
たとえばCドライブのシャドウコピーをただちに取得したい場合、以下コマンドを実行してください。
1 | vssadmin create shadow /For=C: |
シャドウコピー取得の前後で別の処理を行いたい場合、あるいはGUIで取得する方法では定義しづらい複雑なタイミングで取得したい場合には、上記コマンドを含んだバッチファイルやPowerShellスクリプトファイルを作成し、タスク スケジューラーでスケジュール実行させると良いでしょう。
Windows 10でシャドウコピーを任意のタイミングで取得する方法
Windows 10では、さきほどご紹介したWindows Serverでは使用可能なシャドウコピーを作成するコマンド、『vssadmin create shadow』は使用できません。
『vssadmin』コマンド自体は使用可能ですが、機能制限が行われており『vssadmin create shadow』をはじめとした多くの機能が利用できないのです。
そのため、Windows 10でシャドウコピーを任意のタイミングで取得したい場合には、以下のような方法で取得します。(Windows 10 Professional 1709で動作確認済み。)
wmicコマンドを使う方法
Cドライブのシャドウコピーをただちに取得したい場合、管理者権限でコマンド プロンプトを起動し、以下コマンドを実行します。
1 | wmic shadowcopy call create volume=C:\ |
コマンドが正常に実行できていれば、ShadowIDに取得したシャドウコピーのID文字列が表示されます。
1 2 3 4 5 6 7 8 9 10 | (Win32_ShadowCopy)->create() を実行しています メソッドが正しく実行しました。 出力パラメーター instance of __PARAMETERS { ReturnValue = 0; ShadowID = "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}"; }; |
存在しないボリュームを指定した場合には処理が失敗し、ReturnValueには3、ShadowIDは “{00000000-0000-0000-0000-000000000000}”と表示されます。
Win32_ShadowCopyクラスを使う方法
Win32_ShadowCopyクラスを使う方法でもシャドウコピーの作成が可能です。
Cドライブのシャドウコピーをただちに取得したい場合、管理者権限でPowerShellを起動し、以下コマンドを実行します。
1 | (Get-WmiObject -list win32_shadowcopy).Create("C:\","ClientAccessible") |
こちらの方法でもコマンドが正常に実行できていれば、ShadowIDに取得したシャドウコピーのID文字列が表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | __GENUS : 2 __CLASS : __PARAMETERS __SUPERCLASS : __DYNASTY : __PARAMETERS __RELPATH : __PROPERTY_COUNT : 2 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : ReturnValue : 0 ShadowID : {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} PSComputerName : |
そして存在しないボリュームを指定した場合には処理は失敗し、ReturnValueには3、ShadowIDは “{00000000-0000-0000-0000-000000000000}”と表示されるのも同様です。
これらコマンド実行するPowerShellスクリプトを作成し、タスクスケジューラーを組み合わせれば、以下のように15分間隔でシャドウコピーを作成することが可能となります。
※図中一部15分間隔で取得できていないところがありますが、これは『バックアップと復元 (Windows 7)』機能によるバックアップが動作したなどの理由によります。
尚、wmicコマンドを使う方法と、Win32_ShadowCopyクラスを使う方法で実行するコマンドを含んだバッチファイルやPowerShellスクリプトは、共に管理者権限で実行しなければエラーとなり、正常に実行されないのでご注意ください。
Windows 10のScopeSnapshotsの無効化について
Windows 8以降のクライアントOSではScopeSnapshotsという機能により、シャドウコピーから一部のファイルを復元できない場合があります。
本設定はWindows 10ではデフォルトでONとなっています。
これをWindows 7やWindows Server 2012 R2と同じような挙動に戻すためには、レジストリエディターで以下キーを追加してください。
- キー名:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore
- 値の名前:ScopeSnapshots
- 値の種類:REG_DWORD / DWORD(32ビット)
- 値のデータ:0
PowerShellを管理者権限で起動し、キー追加コマンドを実行していただいてもOKです。
1 | reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" /v ScopeSnapshots /t REG_DWORD /d 0 |
シャドウコピーの取得可能世代数を増やす方法
Windows 10のシャドウコピーは、初期設定では最大64世代しか取得できません。
仮に15分間隔で取得した場合には、過去16時間分しかシャドウコピーを保持できない計算となります。
こういった高い頻度でシャドウコピーを取得したい場合には、取得可能な世代数の上限を増やしておくと良いでしょう。
シャドウコピーの取得世代数は、レジストリエディターで以下キーを追加すれば設定可能です。
- キー名:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS\Settings
- 値の名前:MaxShadowCopies
- 値の種類:REG_DWORD / DWORD(32ビット)
- 値のデータ:1024など取得したい世代数を指定する。
キー追加コマンドを実行する場合には、PowerShellを管理者権限で起動し以下コマンドを実行してください。
1 | reg add HKLM\SYSTEM\CurrentControlSet\Services\VSS\Settings /v MaxShadowCopies /t REG_DWORD /d 1024 |
尚、本設定で取得可能世代数を増やしても、『システムの保護』の『ディスク領域の使用量 – 最大使用量』で設定した値※の影響を受けるため、最大世代数までシャドウコピーが保持されないことがあります。
※『コントロールパネル』→『システム』→『システムの保護』→『任意のボリュームを選択』→『構成』→『ディスク領域の使用量 – 最大使用量』で設定。
『ディスク領域の使用量 – 最大使用量』はPowerShellを管理者権限で起動し、vssadminコマンドで設定することも可能です。
たとえばCドライブの最大使用量のサイズを30GBに設定するケースでは、以下コマンドを実行します。
1 | vssadmin Resize ShadowStorage /For=C: /On=C: /MaxSize=30GB |
ちなみに以前のOSでは最大64世代まででしたが、Windows 10ではこれを超える世代のシャドウコピーを取得可能です。
Diff Areaを増やす方法
VSS(volume shadow copy)では内部的にDiff Areaという領域を使用して、機能を実現しています。
VSSが動作した際、Diff Areaを拡張(領域の拡大)しようと試み、それが失敗することでボリュームのシャドウコピーがすべて削除されることがあります。
これは結構有名な問題でして、問題発生時にイベントログに残るソースとIDから、volsnap 25エラーなんて呼ばれています。
参考:Windows Serverで不定期に発生していたvolsnap 25エラーがなおった!
そこでDiff Areaをあらかじめ大きくしておくことで、エラーが起きにくくする対策をとっておくと良いでしょう。
こちらもレジストリエディターで、以下キーを設定して対応します。
- キー名:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VolSnap
- 値の名前:MinDiffAreaFileSiz
- 値の種類:REG_DWORD / DWORD(32ビット)
- 値のデータ:5000など設定したいサイズ(MB)を指定する。
たとえばDiff Areaのサイズを5GBに設定する場合、以下コマンドを実行します。
1 | reg add HKLM\SYSTEM\CurrentControlSet\Services\VolSnap /v MinDiffAreaFileSize /t REG_DWORD /d 5000 |
尚、従来Windows Server 2012 R2では、Diff Areaの最大値は3000(3GB)でした。
ですが現在では、更新を適用すれば最大サイズに5000(5GB)まで指定可能となります。
その他シャドウコピー関連で知っておくと便利なコマンドについて
最後にWindows 10でも使用可能な、その他シャドウコピー関連で知っておくと便利なコマンドについてご紹介しましょう。
シャドウコピーの割り当て領域・使用領域を一覧表示する方法
各ボリュームについて、シャドウコピーの割り当て領域や現在使用中の領域を知りたいことがあります。
vssadminコマンドには一覧表示する機能が用意されているので、PowerShellを管理者権限で起動し、コマンドを実行してください。
1 | vssadmin list shadowstorage |
取得済みのシャドウコピーの一覧を表示する方法
コマンドプロンプトやPowerShellで取得設定をしたシャドウコピーが、正常に取得できているかどうかを知りたい場合には、以下コマンドを管理者権限で実行してください。
1 | vssadmin list shadows |
ちょっと結果が見づらいですが、各ボリュームのシャドウコピーの作成時刻などの情報を知ることが可能です。
以上、Windows10でVSS(volume shadow copy)を任意のタイミングで取得するときには、ぜひ参考になさってくださーい!