【入門編】【上級プロフェッショナル向け】ボリューム・シャドウ・コピー(VSS)コマンド連携による「排他ロック中ファイル」のFSO読み取りバイパス – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptで「ロックされたファイルを強奪する」極限のテクニック:VSS連携によるファイルアクセス

こんにちは。自動化の現場で血の滲むようなデバッグを乗り越えてきた皆さん。
VBScriptを使っていて、こんな絶望的な状況に陥ったことはありませんか?

「データベースが起動中で、ログファイルにアクセスできない(Permission Denied)」

FSO(FileSystemObject)は非常に強力ですが、OSの排他制御の前では無力です。しかし、諦めるのはまだ早い。Windowsの深淵にある「ボリューム・シャドウ・コピー(VSS)」をVBScriptから叩き起こせば、ロック中のファイルを「別次元のコピー」として安全に抽出できるのです。

今日は、プロの運用者が密かに使っている「VSSバイパス」という禁じ手を、ステップバイステップで解説します。

—

1. なぜ「排他ロック」は突破できないのか?

まず、敵を知りましょう。Windowsは、書き込み中のデータベースファイルなどに他のプロセスが触れないよう、厳重な「鍵」をかけています。FSOで`OpenTextFile`を叩いても、OSから「アクセス拒否」と突き返されるのは、この鍵が開かないからです。

そこで我々が狙うのは、「OSが作成するバックアップ用の静止点(シャドウコピー)」です。VSSは、ファイルが使用中であっても、その瞬間のデータを物理的に切り離してコピーする機能を持っています。これを利用すれば、ロックの影響を受けずにデータが読み出せるというわけです。

—

2. 実践:VSSを使ってロックを回避する戦略

VBScript単体ではVSSの全機能を操ることはできませんが、Windows標準のコマンドラインツール `vssadmin` や `wmic` と連携させることで、スクリプトから自動実行が可能になります。

処理の流れ

1. 一時的なシャドウコピーの作成: `wmic` コマンドで対象ドライブのコピーを作成。
2. パスの特定: 生成されたシャドウコピー内のパスを取得。
3. FSOによる読み取り: シャドウコピー内のファイルにアクセス。
4. クリーンアップ: 作業が終わったらシャドウコピーを即座に破棄。

—

3. 実装コード(VBScript)

このコードは、管理者権限で実行してください。VSSの操作には特権が必要不可欠です。

‘ VSSバイパスによる排他ファイル読み取りスクリプト
Option Explicit

Dim fso, shell, wmi, shadowId, shadowPath, targetFile
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set shell = CreateObject(“WScript.Shell”)

‘ 対象ファイル(例: C:\Data\Database.db)
targetFile = “C:\Data\Database.db”

‘ 1. シャドウコピーの作成 (WMICを使用)
‘ ※戻り値からIDを解析する高度なロジックが必要です
shadowId = CreateShadowCopy(“C:”)

If shadowId <> “” Then
‘ 2. シャドウコピー内のパスを構築
‘ シャドウコピーは \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyX\… という形式でマウントされます
shadowPath = “\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\” & fso.GetFileName(targetFile)

‘ 3. FSOで読み取り
If fso.FileExists(shadowPath) Then
Dim ts, content
Set ts = fso.OpenTextFile(shadowPath, 1) ‘ 1 = ForReading
content = ts.ReadAll
ts.Close
WScript.Echo “成功!ファイルの内容を取得しました。”
End If

‘ 4. 後始末(重要:忘れるとディスクを圧迫します)
shell.Run “vssadmin delete shadows /Shadow=” & shadowId & ” /Quiet”, 0, True
End If

‘ シャドウコピーを作成する補助関数
Function CreateShadowCopy(drive)
‘ 簡易実装のため、詳細はvssadminの出力結果を解析するロジックを組んでください
shell.Run “vssadmin create shadow /for=” & drive, 0, True
CreateShadowCopy = “ID_PLACEHOLDER” ‘ 実際にはここでIDを取得
End Function

—

4. プロの現場で陥りやすい「罠」

この手法は強力ですが、いくつか注意点があります。

  • 権限の壁: 管理者権限(昇格)がないと、`vssadmin` は門前払いです。スクリプト実行時は「管理者として実行」を強制するバッチファイルをラッパーとして作成しましょう。
  • ストレージの枯渇: シャドウコピーを大量に作成すると、ディスクの空き容量が食いつぶされます。必ず `delete shadows` を忘れずに行うループ処理を組み込んでください。
  • 整合性の問題: データベースファイルをコピーした場合、そのコピーが「書き込み中だった瞬間の不整合な状態」である可能性があります。読み取り専用として使う分には問題ありませんが、復元用途には向かないことを理解しておきましょう。

—

最後に:VBScriptを使いこなすということ

「VBScriptは古い」と言う人もいます。しかし、OSの根幹に近い部分を叩くには、これほどシンプルで強力な道具はありません。

今回紹介した「VSSバイパス」のように、「OSが何を考えているのか」を理解すれば、どんな排他制御も突破口は見つかります。皆さんが直面している自動化の壁は、決して乗り越えられないものではありません。

技術は目的を達成するための「手段」に過ぎません。困ったときは、OSの仕様という「ルール」をもう一度読み解いてみてください。きっと、解決の糸口が見えてくるはずですよ。

それでは、素晴らしい自動化ライフを!

タイトルとURLをコピーしました