Windows Serverの共有フォルダーで、[以前のバージョン]から誤って違うフォルダで[復元]をクリックするという痛恨のミスをしました。
その後、すぐに[×]でキャンセルしても、途中まで古いファイルへ戻っていないか不安が残ります。
そこで、誤操作前のシャドウコピーと現在のフォルダーを、Windows標準のRobocopyで比較しました。対象は190,069ファイルです。
この記事では、その実体験を基に、次の内容を解説します。
- 誤操作前のシャドウコピーを特定する方法
- VSSを通常のフォルダーとして参照する方法
- Robocopyで実データを変更せず差分を抽出する方法
- 誤復元の可能性があるログの見分け方
- SHA-256ハッシュによる厳密な確認方法
一般的なコピー・移動の誤操作については、次の記事で解説しています。

過去のVSSを比較元、現在のデータを比較先にして比較する

本記事では、次の方向で比較します。
| Robocopy上の役割 | 対象 |
|---|---|
| 比較元・Source | 誤操作前のシャドウコピー |
| 比較先・Destination | 現在使用している実フォルダー |
コマンドの基本形は次のとおりです。
robocopy "過去のVSS" "現在の実フォルダー" /L その他のオプションRobocopyのログは、比較元である過去のVSSから見た表現で出力されます。
この前提で、差分を次のように判断します。
| ログ表示 | 過去のVSSと現在の関係 | 管理者の判断 |
|---|---|---|
新しい・Newer | 過去のVSSの方が新しく、現在が古い | 🔴 現在のファイルが古い版へ戻った可能性 |
古い・Older | 過去のVSSの方が古く、現在が新しい | 🟢 VSS取得後の正常な更新 |
新しいファイル・New File | VSSにはあるが、現在の同じ場所にはない | 🟡 削除・移動・名前変更を確認 |
EXTRA File | 現在側にだけ存在する | 🟢 VSS取得後の新規作成など |
EXTRA Dir | 現在側にだけフォルダーが存在する | 🟢 VSS取得後の新規作成など |
変更済み・Changed | サイズや属性などに差がある | 🟡 内容やハッシュを確認 |
失敗・Failed | 読み取りやアクセスに失敗した | 🔴 アクセス権やパスを確認 |
特に注意するのは、既存ファイルに対して表示される**「新しい」**です。
過去のVSSの方が新しいということは、現在のファイルがVSS取得時点より古くなっているため、誤復元の可能性があります。
ただし、古い日時を持つファイルを別の場所から配置した場合なども同じ表示になるため、ログだけで断定せず、必要に応じてハッシュを比較します。
Robocopyを実行する前の最重要注意事項
Robocopyには必ず
/Lを付けてください。
/Lは、ファイルのコピー・削除・タイムスタンプ変更を行わず、処理対象だけを一覧表示するオプションです。
/Lを外すと、シャドウコピー側から現在の実フォルダーへ、実際にファイルがコピーされる危険があります。
Microsoft Learnでも、/Lはファイルを一覧表示するだけで、コピー・削除・タイムスタンプ変更を行わないオプションとされています。
差分確認だけを行う場合は、次のオプションも使用しません。
/MIR
/PURGE
/MOVE
/MOV
これらはミラーリング、削除、移動など、実データを変更する処理に関係します。
調査前に誤操作の状況を記録する
最初に、次の情報を記録します。
- 誤操作した日時
- 対象フォルダーのフルパス
- 選択していた[以前のバージョン]の日時
- [復元]を押してからキャンセルするまでの時間
- 操作したユーザーアカウント
- 上書き確認が表示されたか
- 誤操作後にファイルを編集・保存したか
- 誤操作後に利用者が共有フォルダーを使用したか
VSS取得後に利用者が行った正常な編集も、差分として検出されます。
可能であれば、誤操作後の新規書き込みを一時的に止めるか、利用者の少ない時間帯に比較してください。
比較に使うシャドウコピーの選び方
原則として、誤操作直前のシャドウコピーを選びます。
次の条件に近いほど、差分を判断しやすくなります。
- 誤操作の直前に取得されている
- 取得後から誤操作までの更新が少ない
- 共有フォルダーの[以前のバージョン]として利用されている
筆者の事例では、前営業日終了後に取得されたシャドウコピーを使用しました。
Windows ServerでVSSと現在のデータを比較する手順
ここから、実際の操作手順を説明します。
例として、現在の対象フォルダーを次のパスとします。
D:\共有フォルダ\対象フォルダーステップ1:管理者としてコマンドプロンプトを起動する
Windows Serverへ、管理者権限のあるアカウントでサインインします。
スタートメニューで「コマンドプロンプト」または「cmd」を検索し、[管理者として実行]を選択してください。
以降のvssadminとmklinkは、管理者権限のコマンドプロンプトで実行します。
ステップ2:誤操作前のシャドウコピーを確認する

対象フォルダーがDドライブにある場合は、次のコマンドを実行します。
vssadmin list shadows /for=D:vssadmin list shadowsは、指定したボリュームに存在するシャドウコピーを一覧表示するコマンドです。
Cドライブの場合は、次のように変更します。
vssadmin list shadows /for=C:表示結果から、誤操作直前のシャドウコピーを探します。
確認する項目は次のとおりです。
- 作成時刻
- シャドウコピーID
- シャドウコピーボリューム
- 属性
シャドウコピーボリュームは、次の形式で表示されます。
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy246
末尾の番号は環境ごとに異なります。
ClientAccessible属性を確認する
共有フォルダーの[以前のバージョン]として使用されるシャドウコピーでは、属性にClientAccessibleが含まれることがあります。
一方、バックアップソフトが作成したVSSでは、ApplicationRollbackなどの属性が表示されることがあります。
ユーザーがエクスプローラーの[以前のバージョン]から操作したケースでは、誤操作前のClientAccessibleシャドウコピーを優先すると確認しやすくなります。
ステップ3:VSSへのシンボリックリンクを作成する

確認したシャドウコピーを、通常のフォルダーのように参照できる状態にします。
例として、次のシャドウコピーを使用します。
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy246次のコマンドを実行します。
mklink /D "C:\VSS_COMPARE" "\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy246\"
mklink /Dは、ディレクトリへのシンボリックリンクを作成するコマンドです。
成功すると、次のように表示されます。
C:\VSS_COMPARE <<===>> \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy246\ のシンボリック リンクが作成されました
C:\VSS_COMPAREはコピー先ではない
C:\VSS_COMPAREは、シャドウコピー内のデータをCドライブへコピーする場所ではありません。
過去のデータを参照するための入口です。
現在のフォルダーが次の場合、
D:\共有フォルダ\対象フォルダー
過去の同じフォルダーは、次のパスで参照できます。
C:\VSS_COMPARE\共有フォルダ\対象フォルダー
シャドウコピー全体がCドライブへ複製されるわけではありません。
ステップ4:VSS内の対象フォルダーを確認する

まず、VSSのルートが開けるか確認します。
dir "C:\VSS_COMPARE"続いて、対象フォルダーを確認します。
dir "C:\VSS_COMPARE\共有フォルダ\対象フォルダー"ファイルやサブフォルダーが表示されれば、準備は完了です。
ステップ5:ログ保存用フォルダーを作成する
比較結果を保存するフォルダーを作成します。
mkdir C:\Tempすでに存在する場合は、そのまま利用できます。
複数回調査するときは、対象名や日付をログファイル名へ付けると管理しやすくなります。
C:\Temp\restore_diff_20260727.txtステップ6:Robocopyで差分だけを抽出する

次のコマンドを実行します。
robocopy "C:\VSS_COMPARE\共有フォルダ\対象フォルダー" "D:\共有フォルダ\対象フォルダー" /E /L /R:0 /W:0 /XJ /FP /TS /BYTES /NDL /NP /TEE /LOG:"C:\Temp\restore_diff.txt"実行前に、比較元がVSS、比較先が現在の実フォルダーになっていることを確認してください。
使用するオプション
| オプション | 役割 |
|---|---|
/L | 実データを変更せず、処理対象だけを一覧表示する |
/E | 空フォルダーを含むサブフォルダーを対象にする |
/R:0 | エラー時の再試行を行わない |
/W:0 | 再試行の待機時間を0秒にする |
/XJ | ジャンクションポイントを除外する |
/FP | ファイルのフルパスを表示する |
/TS | ファイルの更新日時を表示する |
/BYTES | ファイルサイズをバイト単位で表示する |
/NDL | ディレクトリ名の一覧を表示しない |
/NP | 進捗率の表示を省略する |
/TEE | 画面とログの両方へ結果を出力する |
/LOG | 指定したファイルへ結果を保存する |
大量のファイルでは時間がかかる
数万件から数十万件のファイルを比較すると、処理完了まで時間がかかります。
エラーが表示されず、ファイルパスが順番に処理されていれば、そのまま待ちます。
途中で中断するときはCtrl+Cを使用できますが、ログには中断した時点までの結果しか残りません。
ステップ7:差分ログを確認する
比較が完了したら、ログを開きます。
notepad "C:\Temp\restore_diff.txt"最初に、ログ末尾の集計を確認します。
- ファイルの合計件数
- 差分として検出された件数
- 不一致
- 失敗
- Extras
- 終了時刻
/Lを付けている場合、集計欄の「コピー済み」に数字が表示されても、実際にコピーされた件数ではありません。
通常実行した場合にコピー対象になるファイル数を示しています。
個別の差分は、冒頭の「過去VSSと現在データの判定表」に照らして確認します。
差分を次のグループに分けると整理しやすくなります。
- 現在側が古くなっている既存ファイル
- VSS側にだけ存在するファイル
- 現在側にだけ存在するファイル
- 読み取りに失敗したファイル
- サイズや属性が異なるファイル
Officeの一時ファイルやThumbs.dbなど、業務上の異常ではない差分も含まれます。
ファイル名、更新日時、利用者の作業内容を照合してください。
ステップ8:疑わしいファイルをSHA-256で比較する

Robocopyは、主に次の情報を使って差分を判定します。
- ファイル名
- サイズ
- 更新日時
- 属性
ファイル内容を1バイト単位で比較するものではありません。
重要ファイルの内容を厳密に確認するときは、PowerShellのGet-FileHashを使用します。
VSS側のハッシュ
Get-FileHash "C:\VSS_COMPARE\共有フォルダ\対象フォルダー\対象ファイル.xlsx" -Algorithm SHA256現在側のハッシュ
Get-FileHash "D:\共有フォルダ\対象フォルダー\対象ファイル.xlsx" -Algorithm SHA256Get-FileHashはファイル内容からハッシュ値を計算し、既定ではSHA-256を使用します。2つのハッシュが一致すれば、ファイル内容も一致しています。
誤って選択した古いVSSが分かっている場合は、次の3つを比較します。
- 誤操作直前のVSS
- 誤って選択した古いVSS
- 現在のファイル
現在のハッシュが古いVSSと一致し、誤操作直前のVSSとは異なる場合は、古い版へ戻った可能性が高いと判断できます。
【実証事例】190,069ファイルを比較した結果

筆者の事例では、Windows Serverの共有フォルダーで、誤って[以前のバージョン]の[復元]をクリックしました。
すぐに[×]を押しましたが、一部のファイルだけ復元されていないかを確認する必要がありました。
そこで、前営業日終了後に取得されたシャドウコピーと現在のフォルダーを比較しました。
使用したコマンドは次の形式です。
robocopy "C:\VSS_COMPARE\共有フォルダ\対象フォルダー" "D:\共有フォルダ\対象フォルダー" /E /L /R:0 /W:0 /XJ /FP /TS /BYTES /TEE /LOG:"C:\Temp\restore_diff.txt"結果は次のとおりです。
| 項目 | 件数 | 確認結果 |
|---|---|---|
| 比較対象ファイル | 190,069件 | 対象フォルダー全体を比較 |
| 差分候補 | 38件 | /Lのため実コピーはなし |
| 現在側にだけあるファイル | 17件 | 新規作成・Office一時ファイルなど |
| 現在側にだけあるフォルダー | 5件 | VSS取得後に作成されたフォルダー |
| VSS側にだけあるファイル | 4件 | 名前変更・移動・資料統合で説明可能 |
| 現在側で正常更新されたファイル | 34件 | VSS取得後の業務上の更新 |
| 現在側が古くなっていたファイル | 0件 | 誤復元を示す差分なし |
| 読み取り失敗 | 0件 | 全対象を読み取り可能 |
差分として検出されたファイルは、次の内容で説明できました。
- VSS取得後に作成された業務ファイル → 問題なし
- WordやExcelの一時ファイル → 問題なし
Thumbs.db- ファイル名を変更した資料 → 問題なし
現在側がVSSより古くなっている既存ファイルは0件でした。
この結果から、ファイル名・サイズ・更新日時などを比較した範囲では、誤復元による影響は確認されなかったと判断しました。
Robocopyだけで全ファイルの内容を完全証明できるわけではありません。
ただし、190,069件から疑わしいファイルを絞り込み、必要なものだけハッシュ比較する方法として有効でした。
イベントログだけでは誤復元を特定できない場合がある
誤操作後にイベントビューアーを確認しても、どのファイルが復元されたのか分からない場合があります。
ファイルアクセスをセキュリティログへ記録するには、一般に次の両方が必要です。
- ファイルシステムの監査ポリシーを有効にする
- 対象フォルダーへSACLを設定する
Microsoft Learnでも、監査イベントを生成するには、監査ポリシーと対象オブジェクトに一致するSACLが必要と説明されています。
誤操作前から監査を設定していなければ、事後に設定しても過去の操作記録は生成されません。
その場合は、VSSと現在のデータを直接比較する方法が有効です。
調査後にシンボリックリンクを削除する

確認が完了したら、作成したリンクを削除します。
最初に、リンクであることを確認します。
dir /AL C:\VSS_COMPAREがシンボリックリンクとして表示されたら、次のコマンドを実行します。
rmdir "C:\VSS_COMPARE"削除されるのはC:\VSS_COMPAREというリンクだけです。
シャドウコピー本体や、Dドライブの実データは削除されません。
よくある質問
Robocopyのログに「コピー済み」と表示されました
/Lを指定している場合、実際にコピーされた件数ではありません。
通常実行した場合に、コピー対象となる差分候補の件数です。
Robocopyだけでファイル内容の完全一致を確認できますか?
完全一致の確認には向いていません。
Robocopyで差分候補を絞り込み、重要ファイルをGet-FileHashで比較してください。
イベントログから復元されたファイルを確認できますか?
誤操作前からファイルアクセス監査とSACLを設定していなければ、個々のファイル操作を事後に追跡できない場合があります。
VSSと現在のフォルダーを直接比較する方法が現実的です。
Hyper-V上のWindows Serverでも同じ方法を使えますか?
ゲストOS内でVSSが有効になっており、対象ボリュームにシャドウコピーが残っていれば、ゲストOSへログインして同じ手順を使用できます。
ただし、Hyper-Vのチェックポイントと、ゲストOS内の[以前のバージョン]は別の仕組みです。Hyper-Vのチェックポイントを適用すると、仮想マシン全体を過去の状態へ戻す操作になるため、個別ファイルの確認だけを目的に安易に適用しないでください。Hyper-Vの運用チェックポイントは、WindowsゲストではVSSを利用できますが、復元範囲はVM単位です。
Azure VMでは、Azure BackupのRecovery Servicesコンテナーに復旧ポイントがある場合、VM全体だけでなく、個別のファイルやフォルダーを回復できます。
まとめ:感覚ではなくログで安全性を確認する
[以前のバージョン]で誤って[復元]を押した場合、すぐにキャンセルしても、一部の処理が完了していないとは断定できません。
管理者が押さえるべき要点は次の2つです。
- 誤操作前のVSSと現在のフォルダーを同じパス構造で比較する
- 実データを変更しない設定で差分ログを保存する
今回の事例では、190,069ファイルを比較し、誤復元を示す差分と読み取り失敗はいずれも0件でした。
「おそらく大丈夫」という感覚ではなく、差分ログと必要に応じたハッシュ比較で根拠を残すことで、利用者や上長へ安全性を説明できます。
誤操作が起きたときほど復元を繰り返さず、現在の状態を保全してから確認することが重要です。

