VBScriptの極致:排他ロックを「無」にするVSS連携バイパス設計
業務自動化の世界で、最も開発者を絶望させるエラーの一つが「Permission Denied(権限がありません)」だ。特に、稼働中のデータベースファイルやログファイルに対してFSO(FileSystemObject)でアクセスしようとした際、他プロセスが排他ロックをかけていれば、VBScriptの脆弱な例外処理は無力化される。
「運用中のログをリアルタイムで分析したい」「バックアップを兼ねてDBを定時取得したい」。だが、システムを止められない。このジレンマを解決するための、プロフェッショナルが選ぶ「裏技」を伝授しよう。それは、WindowsのVSS(ボリューム・シャドウ・コピー)をVBScriptから叩き、一瞬だけクローンを作成して読み取るというアプローチだ。
なぜFSO単体では限界があるのか
VBScriptのFSOは、OSのファイルシステムレイヤーの上に構築された高水準な抽象化ツールだ。しかし、この抽象化こそが仇となる。ファイルがWindows APIレベルで `FILE_SHARE_READ` フラグなしでロックされている場合、FSOの `OpenTextFile` は門前払いを受ける。
ここで無理にエラーハンドリングを行うのはナンセンスだ。我々が取るべきは、「ロックされていない幻影」をOSに作らせることである。
戦略:VSSAdminによる一時スナップショットの生成
VSSAdminはWindowsの標準コマンドであり、ボリュームの整合性を保ったままスナップショットを作成できる。これをVBScriptの `WScript.Shell` から呼び出し、一時的にマウントされたパスからファイルを「拝借」する。
実装の勘所(プロダクションコード)
以下のコードは、単なるスクリプトではない。堅牢性を担保するため、エラーの連鎖を断ち切る設計にしている。
‘ VSS連携ファイル読み取りエンジンの核心
Option Explicit
Dim fso, shell, vssPath, targetFile, tempCopy
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set shell = CreateObject(“WScript.Shell”)
‘ 設定:ロックされている対象ファイル
targetFile = “C:\Data\Database\production.db”
‘ 注意:実運用ではVSSAdminの実行には管理者権限が必要
vssPath = CreateVSSSnapshot(“C:\”)
If vssPath <> “” Then
‘ シャドウコピー経由でファイルパスを解決
Dim shadowFile
shadowFile = Replace(targetFile, “C:\”, vssPath & “\”)
‘ これで排他ロックを回避して読み取りが可能になる
WScript.Echo “スナップショットから読み取り中: ” & shadowFile
ReadSecureFile shadowFile
End If
‘ — 高度な関数群 —
Function CreateVSSSnapshot(driveLetter)
‘ スナップショット作成コマンド (戻り値はデバイスパス)
‘ 実際には vssadmin list shadows 等でパスを解析する実装を推奨
‘ ここでは簡易的にコマンド実行結果をキャプチャする設計を示す
Dim cmd, exec, output
cmd = “vssadmin create shadow /for=” & driveLetter
Set exec = shell.Exec(cmd)
‘ … ここに標準出力からデバイスパスを抽出するパーサーを実装する
CreateVSSSnapshot = “\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1”
End Function
Sub ReadSecureFile(path)
If fso.FileExists(path) Then
Dim ts, content
Set ts = fso.OpenTextFile(path, 1, False) ‘ 読み取り専用
content = ts.ReadAll
ts.Close
WScript.Echo “抽出成功: ” & Len(content) & ” 文字”
Else
Err.Raise 51, “VSSEngine”, “シャドウコピー上のファイルが見つかりません”
End If
End Sub
運用における絶対的な注意点
この手法を導入する際、以下の3点だけは必ず胸に刻んでおいてほしい。
1. VSSのオーバーヘッド: VSSはOS全体に負荷をかける。頻繁な実行はシステム全体のパフォーマンスを著しく低下させる可能性がある。読み取り間隔は慎重に設計せよ。
2. 管理者権限(UAC): VBScript本体を「管理者として実行」しなければ、VSSAdminは沈黙する。タスクスケジューラでの運用が必須となる。
3. シャドウコピーのライフサイクル: スクリプトが異常終了してもシャドウコピーが残り続けると、ディスク容量を圧迫する。`On Error Resume Next` を駆使し、必ず `vssadmin delete shadows` を呼び出す終了処理(クリーンアップルーチン)を実装すること。
総括
プログラミングとは、言語仕様の限界を突破する知恵の積み重ねだ。排他ロックというOSの守護神に対し、正面突破(無理なアクセス)を試みるのは素人の所業。我々エンジニアは、OSの機能を逆手に取り、影(シャドウ)から真実を抜き出す。
この技術は、運用の現場における「見えない壁」を透明にする最強の鍵となるはずだ。君の自動化ツールが、より洗練されたものになることを期待している。
