NTFSにはAlternate Data Streamという機能があってな

今週の水木あたり、集中して時間を取って、やや込み入ったWindows… というかNTFSの機能を調べてテストプログラムを作って遊んだので、その覚書。

スキャナを使って画像を取り込んで、ファイルに落とす処理が今既にある。そのファイルをあとからキーワードを使ってデスクトップ検索で調べられたら便利じゃん!とか思いついた。なにしろSQL Serverとかお高いソフトがなくてもよくなるし、検索機能を自力で実装しなくていい。キーワードは文字認識で抜いてきて、エクスプローラでファイルのプロパティ→詳細タブ(Windows XPでは概要タブ。なんだこの落差はw)にある「キーワード」や「コメント」って欄に値を設定すると、これが検索の対象になる。こうすればjpegのデータはjpegのままだけど、検索対象のワードも持ったファイルになるので超ハッピー!

で、問題。ここって書き込むとどこにデータを持つことになるのか、私は今までちゃんと調べたことがない。ということは、書き込み方もわからない。どーなってんだ? と思って調べると、どうもNTFSの機能でAlternate Data Stream−日本語では代替データストリームという領域に所定のフォーマットで書き込まれているようだ。
How To Use NTFS Alternate Data Streams
上のページのサンプルプログラムにも書いてあるけど、1つのファイルには、実は複数のデータストリームが格納されていて、それぞれに名前が付いている。

      hStream = CreateFile( "testfile:stream",

こう書くと、testfileってファイルのstreamって名前のストリームを開く。デフォルトのストリーム名は":$DATA"。ストリーム名を省略するとこのストリームを自動的に読み書きしているだけだった、ということが判明。
2005-09-08 - アンタイ・フォレンジック伝道者の独り言
このへんも参考になる。
で、だ
やりたいのはファイルのプロパティ→詳細タブの各項目に当たる部分に値を書き込む事なんだけど、ストリーム名がわからない;; あっちこっち探してみてデータストリームにどんなものがあるのか列挙して表示してくれるツールをDLして表示させてみた。
WILL - NTFS Stream reader

上の画像は大本のサイトに置いてあったものに赤線を入れたもの。SummaryInformationがそれっぽいけど、この中黒はなんなんだ;; ストリーム名に":SummaryInformation"を指定したけどだめだった。で、あっちこっち調べたらどーもこの中黒はchr(5)であることが判明。

NTFS streams and document summary info.
ƒtƒ@ƒCƒ‹î•ñ‚ðŽæ“¾‚·‚é‚ɂ́H
で、ストリーム名を":" & chr(5) & "SummaryInformation"で組み立てて読み取ると! なんとバイナリ!!!!! このバイナリの仕様しらなかったらなんにもできねえええええええええええ!!!!!

orz

で、検索語を調整しながら調べてついに下のページに到達。
マイクロソフト TechNet オンライン | IT 担当者の「知りたい」が見つかる実践情報サイト

Set objFile = CreateObject("DSOFile.OleDocumentProperties")
objFile.Open("C:\Scripts\New_users.xls")
objFile.SummaryProperties.Title = "New title added via a script"
objFile.Save

こんだけかよ!!! 今まで苦労して調べた代替データストリームとやらは一体何だったのか!! …ま、いい勉強にはなったけどね。で、DSOFileとやらをDLしてインストール。
Download Microsoft Developer Support OLE File Property Reader 2.1 Sample (KB 224351) from Official Microsoft Download Center
これで、やりたい事が実装できた。金曜の夜は同僚にデモしてそれなりにウケたっぽいのでかなり満足。この代替データストリームそのものは、データの隠し場所としても使える(なにしろファイルのプロパティで見ても、:$DATAストリーム以外のデータ量が加算されないので一見わからない)ので、セキュリティ上のリスクのある機能でもある。ちょっと運用を考えないといけないけど、なかなか使い方によっては面白い事ができそうだ。

うむ、勉強になった!