【テクニカル・上級編】【上級プロフェッショナル向け】Windows CipherコマンドとFSOを連動させた機密ファイルの自動暗号化フォルダ格納パイプライン – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

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アーキテクチャの深層で、最も安定して動作するツールの一つだ。このコードをそのまま使うのではなく、例外処理のラッパーを強化し、実行ログをイベントビューアに書き出す実装へと昇華させてほしい。

自動化とは、単なる作業の省力化ではない。人間が介入する余地(脆弱性)を限りなくゼロに近づけるための、静かな戦いである。諸君の健闘を祈る。

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