こんにちは! VBScriptの世界へようこそ。
普段、業務自動化でファイルやフォルダをいじっていると、「ファイルそのものは見せたくないけれど、このファイルに関する特殊な管理フラグや処理履歴だけをこっそり持たせたい……」なんて悩みにぶつかったことはありませんか?
「そんなの、別のINIファイルやDBを用意すればいいじゃないか」と思いますよね。でも、ファイル単体で持ち運びたい、あるいはエクスプローラーの通常操作でうっかり消されたくない、そんなマニアックで高度な現場の要求に応える裏技があるんです。
それが、Windowsのファイルシステム(NTFS)に備わっている「オルタネート・データ・ストリーム(ADS:Alternate Data Stream)」という機能と、我らがFSO(FileSystemObject)を組み合わせたテクニックです。
ここをクリアすれば、あなたのVBScriptスキルは間違いなく「一目置かれるレベル」に到達します。さあ、知的なエンジニアへの階段を一緒に登っていきましょう!
—
1. NTFSの隠し部屋「ADS(オルタネート・データ・ストリーム)」とは?
Windowsで使われているNTFSというファイルシステムには、実は「一つのファイルの中に、別のファイルデータを隠し部屋のように同居させる」という驚きの機能があります。
通常、私たちがテキストファイルなどを開くときに見るデータは「メインストリーム」と呼ばれます。しかし、NTFSでは `filename.txt:secret.log` のように、ファイル名の後にコロン(`:`)と任意のストリーム名をつけることで、親ファイルの外見を一切変えずに、全く別のデータを裏で保持させることができるのです。
- エクスプローラーからの見た目: 容量も増えないし、隠しファイルにも見えない。普通のファイル。
- 実態: 親ファイルに紐づいた「裏のデータ倉庫」が存在し、そこに独自の文字列やバイナリを読み書きできる。
今回は、この強力な仕組みをVBScriptのFSO(および標準テキストストリーム)を使って完全にコントロールしてみましょう。
—
2. 【実践】ADSへのメタデータ書き込み・読み込みスクリプト
百聞は一見に如かず。実際に動くコードを見てみましょう。
デスクトップなどに適当なダミーのテキストファイル(例: `report.txt`)を用意して、以下のスクリプトを実行してみてください。
‘ =================================================================0
‘ テーマ: FSOとNTFSオルタネート・データ・ストリーム(ADS)の極秘操作
‘ 概要: 親ファイルを汚さずに、裏のストリームへカスタムメタデータを読み書きする
‘ =================================================================0
Option Explicit
Sub Main()
Dim fso, targetFile, streamName, fullAdsPath
Dim writeData, readData
Dim ts
‘ 1. オブジェクトの生成
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 操作対象となる親ファイル(あらかじめ存在している必要があります)
targetFile = “C:\Temp\report.txt”
‘ 紐付ける隠しストリームの名前(拡張子自由)
streamName = “MetaInfo”
‘ ADSへのアクセスパスの構築 (ファイル名:ストリーム名)
fullAdsPath = targetFile & “:” & streamName
‘ 親ファイルの存在確認
If Not fso.FileExists(targetFile) Then
WScript.Echo “エラー: 親ファイルが見つかりません: ” & targetFile
Exit Sub
End If
‘ =================================================================
なごやかなエラーハンドリングと書き込み処理
‘ =================================================================
WScript.Echo “【1】ADSへ秘密のメタデータを書き込みます…”
‘ FSOのOpenTextFileメソッドを使い、ストリームパスを指定して書き込みモード(2)で開く
‘ 第3引数(True)は、ストリームが存在しない場合に新規作成する指定です
On Error Resume Next
Set ts = fso.OpenTextFile(fullAdsPath, 2, True)
If Err.Number <> 0 Then
WScript.Echo “書き込みエラー発生: ” & Err.Description
Exit Sub
End If
On Error GoTo 0
‘ 書き込みたい管理情報(例:JSON風の文字列や最終処理者情報)
writeData = “{“”LastProcessedBy””:””ChiefArchitect””,””Status””:”& _
“””Approved””,””Timestamp””:” & “””” & Now & “””}”
ts.Write writeData
ts.Close
Set ts = Nothing
WScript.Echo “-> 書き込み成功! 親ファイルの外見は一切変わっていません。”
‘ =================================================================
‘ 読み込み処理
‘ =================================================================
WScript.Echo vbCrLf & “【2】先ほど書き込んだメタデータを裏から読み込みます…”
‘ 読み込みモード(1)で同じADSパスを開く
On Error Resume Next
Set ts = fso.OpenTextFile(fullAdsPath, 1, False)
If Err.Number <> 0 Then
WScript.Echo “読み込みエラー(ストリームが存在しない可能性): ” & Err.Description
Exit Sub
End If
On Error GoTo 0
‘ 全データを読み込む
readData = ts.ReadAll
ts.Close
Set ts = Nothing
‘ 結果の出力
WScript.Echo “【取得した隠しメタデータ】”
WScript.Echo readData
‘ 終了処理
Set fso = Nothing
WScript.Echo vbCrLf & “すべての処理が正常に完了しました。”
End Sub
‘ メイン処理の実行
Call Main()
—
3. コードの深い解説とエンジニアの知見
ここからは、チーフアーキテクトの視点でこのコードの急所を解説します。
① FSOの `OpenTextFile` が持つ驚異の互換性
VBScriptの標準的な `FileSystemObject` は、実はNTFSのADSに対して公式に専用メソッドを用意していません。しかし、OSのファイルI/O層(Win32API)のパス解決の仕様上、コロンで区切られたストリーム名(`file.txt:stream`)は、通常のファイルパスと全く同じようにテキストストリームオブジェクトで開くことができます。
これにより、わずか数行のコードで高度なファイル内データ管理が可能になります。
② なぜこのテクニックが実務で強力なのか?
- ファイル運搬の安全性: メタデータが親ファイルに「寄生」しているため、メールでzip圧縮して送ったり、ファイルサーバー内で移動(同一NTFSボリューム内)させたりしても、メタデータが消えずに追従します。
- ユーザーの誤操作防止: 一般的なユーザーがエクスプローラーからこの隠しデータに気づいて削除することはまずありません。
—
4. 現場で陥りがちな「罠」とエラー回避の極意
この高度なADS操作ですが、一歩間違えるとハマりやすい落とし穴があります。現場で泣きを見ないために、以下のポイントを必ず頭に叩き込んでおいてください。
罠1: FAT32やexFAT、ネットワーク共有での絶望
- 原因: ADSはNTFS固有の機能です。USBメモリなどでよく使われるFAT32やexFAT、あるいは一部の古いNAS(SAMBAのバージョンや設定による)では、ADSの概念が存在しません。
- 対策: スクリプトを実行する前に、対象のドライブがNTFSであるかチェックするか、エラーハンドリング(`On Error Resume Next`)を必ず実装し、失敗したときのフォールバック(代替処理)を用意しておきましょう。
罠2: ファイルをコピー・移動したときの「消滅」
- 原因: NTFSボリューム外(例:デスクトップからUSBメモリへ、あるいはWebストレージへアップロード)にファイルを移動・コピーすると、OSのセキュリティ警告や仕様により、ADS(隠しメタデータ)は綺麗に消去されます。
- 対策: あくまで「同一のローカル/ファイルサーバー(NTFS)内での一時的なアタッチメント情報」として割り切って使いましょう。長期保存や厳密な監査ログにはデータベースやJSONファイルを別個に用意するのが定石です。
—
おわりに
今回は、FSOとNTFSのADSを組み合わせた、ちょっと尖った上級テクニックをご紹介しました。
「VBScriptなんて古い言語だ」と侮るなかれ。OSの深層(NTFSの仕様)を正しく理解し、FSOの挙動と組み合わせれば、ここまでスマートで強力な自動化・情報管理が実現できるのです。
ここをクリアしたあなたなら、どのような業務上の難題が持ち上がっても、柔軟かつエレガントに解決できるはずです。
日々の開発を、もっと知的でエキサイティングなものにしていきましょう。それでは、また次の極限の知見でお会いしましょう!
