VBScriptとEFSの深淵:機密ファイルを保護する自動化パイプラインの構築
レガシー環境の保守、あるいは閉鎖的な基幹システム運用において、VBScriptは依然として「最強の接着剤」だ。しかし、多くのエンジニアは「書ける」だけで「制御」できていない。特に、機密データを扱うファイルシステムオブジェクト(FSO)の操作において、メモリの解放やAPI連携の作法を疎かにすることは、システム全体の脆弱性に直結する。
今回は、FSOで生成した機密ファイルを、Windows標準の暗号化ファイルシステム(EFS)である`cipher.exe`と連動させ、強固な保護領域へ転送するパイプラインを構築する。これは単なるコードの羅列ではなく、OSの特性を理解した「職人のアーキテクチャ」である。
—
1. なぜ「Cipher」との連動が必要なのか
標準的な`FSO.MoveFile`や`CopyFile`だけでは、ファイルがディスク上に平文で書き込まれるリスクがある。たとえNTFSのアクセス権を設定しても、物理ドライブが抜かれたり、OSがオフライン解析されたりすれば無力だ。
`cipher /e`コマンドは、NTFSのEFS属性を即座に付与する。これをVBScriptから非同期、かつ同期的に制御することで、「ファイルが生成された瞬間に暗号化が確定する」という理想的なパイプラインを実現する。
2. 堅牢な実装:Cipher連携パイプライン
以下に、メモリ効率と例外処理を考慮した実装コードを示す。重要なのは、`WshShell.Run`の戻り値による制御と、オブジェクトの明示的な破棄だ。
‘ — 構成: 機密ファイル自動暗号化移動スクリプト —
Option Explicit
Dim fso, shell, file, targetDir, sourceFile
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set shell = CreateObject(“WScript.Shell”)
sourceFile = “C:\Data\Sensitive\Report.dat”
targetDir = “C:\SecureArchive\”
‘ 1. ターゲットディレクトリの存在確認と作成
If Not fso.FolderExists(targetDir) Then
fso.CreateFolder(targetDir)
End If
‘ 2. ファイルの移動
If fso.FileExists(sourceFile) Then
Dim destPath
destPath = targetDir & fso.GetFileName(sourceFile)
‘ 移動処理(上書き許可)
fso.MoveFile sourceFile, destPath
‘ 3. Cipher.exeによるEFS暗号化の適用
‘ /e : 暗号化属性を付与
‘ /h : 非表示ファイルも対象にする
Dim cmd
cmd = “cipher /e “”” & destPath & “”””
‘ 0はウィンドウ非表示、Trueは終了待機
Dim exitCode
exitCode = shell.Run(cmd, 0, True)
If exitCode = 0 Then
WScript.Echo “Success: File encrypted at ” & destPath
Else
WScript.Echo “Error: Cipher operation failed with code ” & exitCode
End If
End If
‘ 4. オブジェクトの明示的解放(メモリリーク防止の定石)
Set shell = Nothing
Set fso = Nothing
—
3. シニアアーキテクトが語る「極限の知見」
オブジェクトライフサイクルの管理
VBScriptのガベージコレクションを信用してはならない。大規模なバッチ処理でループを回す際、`Set obj = Nothing`を怠れば、COMコンポーネントの参照カウントが滞留し、メモリリークやハンドル枯渇を引き起こす。特にファイルシステムを叩く際は、プロセス終了時の後始末までがコードであると肝に銘じよ。
非同期実行の罠と同期の強制
`WshShell.Run`の第3引数`bWaitOnReturn`を`True`に設定している点に注目せよ。これが`False`だと、ファイル移動が完了する前に`cipher`が実行され、「ファイルが見つかりません」というエラーを吐く。並列処理が正義とされる現代だが、排他制御とシーケンシャルな整合性が求められる領域では、あえて「待つ」設計が最も安全である。
EFSの限界を理解する
EFSはユーザープロファイルに紐付く。暗号化を実行したユーザーが退職・削除されれば、そのデータは二度と開けない。「鍵の管理」はOS任せだが、システム管理者としては、暗号化に使用する証明書のエクスポート運用までを設計に含めるべきだ。
最後に:レガシーを「枯れた技術」にするために
VBScriptは死に体ではない。今なお、Windowsという巨大なOSアーキテクチャの深層で、最も安定して動作するツールの一つだ。このコードをそのまま使うのではなく、例外処理のラッパーを強化し、実行ログをイベントビューアに書き出す実装へと昇華させてほしい。
自動化とは、単なる作業の省力化ではない。人間が介入する余地(脆弱性)を限りなくゼロに近づけるための、静かな戦いである。諸君の健闘を祈る。
