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の仕様という「ルール」をもう一度読み解いてみてください。きっと、解決の糸口が見えてくるはずですよ。
それでは、素晴らしい自動化ライフを!
