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

スポンサーリンク

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の機能を逆手に取り、影(シャドウ)から真実を抜き出す。

この技術は、運用の現場における「見えない壁」を透明にする最強の鍵となるはずだ。君の自動化ツールが、より洗練されたものになることを期待している。

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