NTFSの代替データストリームとは
ファイルやフォルダに付けられる付加情報
NTFSの代替データストリーム(Alternate Data Stream。以下ADSと略す)は、ファイルやフォルダと関連付けられ、独立した内容を保持するNTFS上の記憶領域だ。
簡単にいうとNTFS上のファイルやフォルダには、すべてADSと呼ばれる付加情報を一体にして記憶できる。ADSは、NTFS上にある限りファイルと一体で存在し、コピーや移動によって変化することはないが、ファイルを上書きしたり、メモリカードやUSBメモリなどFAT32などのファイルシステムへコピーすると消えてしまう。ADSには、それぞれ名前(ファイル名と同じルール)が付けられる。
同様の機能は、OS/2やNetware、Linuxなどにも見られる。またプラットフォームによって「拡張アトリビュート」、「メタデータ」などさまざまな呼び方がある。
NTFSのADSは、すべての通常ファイル、通常フォルダに追加することが可能だ。また、ADSは1つのファイルに複数追加することもできる。ADSの扱いは基本的にはアプリケーション側に任されており、どのような名前(ただしファイル名と同じルール)を付け、何を保存するのかはまったくの自由だ。見方を変えると、ファイルとは、複数の内容(ストリーム)からできていて、普段は名前のないストリームをアクセスしているといってもいいかもしれない。
ADSは、Windowsが管理のために利用しているが、アプリケーションからも自由に使うことができる。ただし、Windows Explorerには、ADSを表示するなどの機能がなく、標準機能でADSを扱うには、コマンドプロンプトでコマンドを使う必要がある。また、ADSには、ファイルのパス同様、アクセスのための表記方法がある。たとえば、C:\XYZ\ABC.TXTといったファイルがあったとき、sampleという名前のADSは、
C:\XYZ\ABC.TXT:sample
としてパス指定ができる。なお、Windowsは、MS-DOS時代からの慣習でアルファベット1文字と「:」の組合せを常にドライブ文字として認識するため、カレントフォルダのアルファベット1文字のファイル名でADSを指定する場合は、
.\X:sample
としてファイル名であることが判別できるように指定する必要がある。
しかし、このパス表記を受け付けるかどうかはプログラム次第だ。通常のプログラムは、単純にファイルのみをアクセスするため、ADSのパス表記を受け付けないものがほとんどだ。
ただし、コマンドプロンプトでは、ファイルのリダイレクト指定がこの表記を受け付ける。簡単にコマンドラインによる操作を示す。
前記の構文は、ファイルのリダイレトでは確実に受け入れてくれるため、echoやmoreコマンドとファイルのリダイレクトを行なわせて、ファイルを読み書きしている。ただし、ストリームは常にテキストとは限らず、ファイル同様にバイナリデータを含むことも可能である。Dirコマンドの/Rオプションでは、代替データストリームがあれば、それを表示する。
なお、Dirコマンドで表示されるADSの最後についてる「:$DATA」はそのストリームがデータストリームであることを示す代替データストリームの種別である。なお、Windowsは、:$data以外の種別も定義している。このあたりについては、以下のマイクロソフトのドキュメント(英語)を見ていただきたい。
・https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa364404(v=vs.85).aspx
・https://msdn.microsoft.com/en-us/library/dn410405.aspx
インターネットからダウンロードしたデータには
Zone.Identifierという代替データストリームが付く
WindowsによるADSの利用には、インターネットからダウンロードしたファイルのセキュリティ管理がある。これは、ファイルに付けられるADSの名前から「Zone.Identifier」と呼ばれている。IEなどがファイルのダウンロードをした場合に、該当のファイルにADSを付け、ダウンロード元のインターネットゾーン(IEなどのセキュリティ管理範囲)やダウンロード元URLなどの情報を付加するものだ。
ファイルを開こうとすると、インターネットからダウンロードした旨のメッセージが表示されることがあるが、それは、このZone.Identifierの情報を見ているためだ。つまり、インターネットからダウンロードしたファイルには、Zone.Identifierという代替データストリームが付いている。もちろん、NTFS内に置かれていれば、ファイルをコピーしたり移動させても、ADSはそのまま残る。
実際にインターネットからダウンロードしたファイルが持つZone.Identifierとその内容を表示させたのがだ。
このように、Zone.Identifier ADSの中身はテキストファイルで、いくつかの行から構成されている。具体的には、
HostIpAddress:ダウンロード元のホストIPアドレス
ZoneId:インターネットゾーン(3=インターネット)
ReferrerUrl:ダウンロードを開始したページのURL(HTTPリファラ)
HostUrl:ファイルのダウンロードURL
となっている。ただし、ブラウザで「名前を指定して保存」などを使うとReferrerUrlが記録されないことがある。
これを利用すると、過去にダウンロードしたファイルから、ダウンロード元を調べることが可能になる。簡易には、Dir /rでZone.Identifierの有無を確認したあと、
more < ファイル名:Zone.Identifier
でダウンロード元URLを得ることができるが、自動処理を考え、PowerShellを使ってフィルターを作ってみた。Batchでは、ADSの内容を扱うのにはちょっと無理がある。
PowerShellについては、別途解説したいと考えているが、ここでは、ファイルに対応したPowerShellのFileObjectに「HostUrl」と「ReferrerUrl」というプロパティを追加するフィルターを考えた。このようにすることで、いろいろと応用が可能になる。
filter add-zoneidentifier {
$hurl=($_ | get-content -Stream Zone.Identifier -ErrorAction SilentlyContinue | Where-Object {$_ -match "HostUrl="});
$rurl=($_ | get-content -Stream Zone.Identifier -ErrorAction SilentlyContinue | Where-Object {$_ -match "ReferrerUrl="});
if (-not [string]::IsNullOrEmpty($hurl)) {
$_ | Add-Member "HostUrl" $hurl.substring("HostUrl=".length);
}
if (-not [string]::IsNullOrEmpty($rurl)) {
$_ | Add-Member "ReferrerUrl" $rurl.substring("ReferrerUrl=".length);
}
return $_
}
PowerShellのコマンドウィンドウから、
dir *.pdf | add-zoneidentifier | Format-List name,HostUrl,ReferrerUrl
とすれば、カレントディレクトリにあるpdfファイルのHostUrlやReferrerUrlを表示させることが可能だ。
さらに
start microsoft-edge:$((dir ダウンロードファイル名 | add-zoneidentifier).ReferrerUrl)
として、ダウンロードリンクのあるページ(ReferrerUrl)を直接ブラウザ(Edge)で開くことが可能になる(もちろんReferrerUrlが記録されている場合のみ)。また、最後の部分の「ReferrerUrl」を「HostUrl」に変えれば、再ダウンロードやブラウザでの表示ができる。
この連載の記事
-
第467回
PC
Copilot+ PCのNPUでカメラを処理する「Windows Studio Effects」 その内容や効果は? -
第466回
PC
PowerToysの最近の新機能には、複数アプリを指定位置に起動する「ワークスペース」や新規作成のカスタマイズがある -
第465回
PC
WindowsのPowerShellからBluetoothデバイスを調べる -
第464回
PC
Windows 10のサポート切れまで1年を切った さてWindows 10マシンをどうする? -
第463回
PC
Windows Terminal Preview版でSixelグラフィックスを実際に表示させてみる -
第462回
PC
Windows Terminal Preview版でSixelグラフィックスを扱う -
第461回
PC
Copilot+ PCを買ってみたが、「今焦って買う必要はない」のかもしれない -
第460回
PC
Windowsでsftpを使う -
第459回
PC
WSL 2.4.4ではtar形式でのディストリビューションが配布でき、企業での利用が容易になってきた -
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる - この連載の一覧へ