NTFS上のファイルには、メインのデータ以外に、補助的なデータを保存するための「代替データストリーム(ADS)」という機能がある。ファイルにADSが含まれているかどうかは、dir /rコマンドやPowerShellのGet-Itemコマンドレットで確認できる。
対象OS:Windows Vista/Windows 7/Windows 8/Windows 8.1/Windows Server 2008/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2
Windows OSで広く使われているNTFSには「代替データストリーム(ADS:Alternate Data Stream)」(「副次ストリーム」とも呼ばれる)という機能があり、ファイルに対して補助的なデータ(ストリーム)を保存するために利用されている。例えば、Internet Explorerやメールソフトウェアなどでインターネットからダウンロードしたファイルには「Zone.Identifier」という代替データストリーム情報が付加され、インターネットからダウンロードしたファイルであることが分かるようになっている(次のTIPS参照)。
この代替データストリーム情報が付加されたファイルをエクスプローラーでダブルクリックして実行しようとすると警告ダイアログが表示され(ゾーン情報を無視するアプリケーションも少なくないが)、インターネットからダウンロードされた(危険性のある)ファイルであることが分かるようになっている。
代替データストリーム情報を確認する方法として、以下のTIPSではSysinternalsのstreamsコマンドを利用する方法を紹介している。
最近のWindows OSの場合、ストリーム情報の表示だけならWindows OS標準のdirコマンドで確認できる。本TIPSではその方法を紹介する。
Windows Vista/Windows Server 2008以降のWindows OSでは、dirコマンドに「/r」というオプションが追加されており、これを使えば代替データストリームの情報を簡単に確認できる。
C:\>dir /?
ディレクトリ中のファイルとサブディレクトリを一覧表示します。
DIR [ドライブ:][パス][ファイル名] [/A[[:]属性]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]ソート順]] [/P] [/Q] [/R] [/S] [/T[[:]タイムフィールド]] [/W] [/X] [/4]
…(中略)…
/R ファイルの代替データ ストリームを表示します。
…(以下省略)…
/rオプションを付けて実行すると次のように表示される。ファイル名の最後に「:$DATA」という文字列が付いているのが代替データストリームである。ファイルによっては複数のストリームを持っていることがある。
代替データストリームの内容を確認するには、「more < internetzonefile.exe:Zone.Identifier」のように、ストリーム名まで含んだ名前でファイル名を指定すればよい。ただしmoreコマンドではリダイレクトでのみ参照可能となっているなど、Windows OSの標準コマンドやツールでは代替データストリームをそのまま表示、編集できるものは多くない(typeコマンドでは代替データストリーム名を指定してもエラーになる)。
C:\Work>more < internetzonefile.exe:Zone.Identifier …代替データストリームの内容を表示させてみる
[ZoneTransfer] …Internet Explorerなどでインターネットゾーンからファイルをダウンロードすると、このようなゾーン情報が追加される
ZoneId=3
C:\Work>
代替データストリームは用途によっては有用な機能だが、無駄にディスク領域を消費することになるし、代替データストリームを使って自分自身を秘匿するようなウイルスソフトウェアもある(一部のアーカイバーでは代替データストリームも正しく圧縮/維持する機能を持っているが、それを使ってアーカイブファイルにウイルスを紛れ込ませたり、見つつけにくくしたりすることがある)。なので、これを削除したいこともあるだろう。代替データストリームはオプション機能なので、この情報がなくなってもメインのデータストリームさえ残っていれば、ほとんどの場合は問題がない。
dirコマンドを使えば代替データストリーム名を表示することはできるが、削除することはできない。これを削除したければ、TIPS「streamsコマンドでNTFSの代替データ・ストリーム情報を表示/削除する」で解説しているstreamsコマンドを使うか、次の項で述べるPowerShellを使えばよい。また代替データストリームをサポートしていないファイルシステム(FAT32など)や外部のツールなどを使ってファイルをコピーすれば、代替データストリームが欠落して、結果的に削除できる。
PowerShellを使えばファイルの代替データストリーム情報を操作できる。代替データストリーム名を表示したり、削除したりするには、Get-Item/Remove-Itemコマンドレットに「-stream <ストリーム名>」パラメーターを付けて実行する(PowerShellのバージョンによっては利用できない。詳細は「Get-Help Get-Item」などで「-stream」パラメーターがあるかどうかを確認すること)。ただしPowerShellではフォルダーの代替データストリーム情報を表示/操作できないなど、いくらか制限がある。
※これはWindows 8.1上のPowerShell 4.0で実行した場合の例
PS C:\Work2> get-item * ……パラメーターなしのget-item
ディレクトリ: C:\Work2
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2014/06/11 12:32 65731 internetzonefile.exe ……ストリーム名は表示されない
-a--- 2014/07/04 10:35 6561 sample_ads.txt
-a--- 2014/07/03 17:30 19492 sample_noads.txt
PS C:\Work2> get-item * -stream * ……-streamパラメーターを付けて実行してみる。* を指定すると全ストリームが表示される
FileName: C:\Work2\internetzonefile.exe
Stream Length
------ ------
:$DATA 65731 ……メインのデータストリーム
Zone.Identifier 26 ……代替データストリーム
FileName: C:\Work2\sample_ads.txt
Stream Length
------ ------
:$DATA 6561
stream1 5394 ……代替データストリーム1
stream2 181 ……代替データストリーム2
FileName: C:\Work2\sample_noads.txt
Stream Length
------ ------
:$DATA 19492 ……代替データストリームを持たないファイルの例
PS C:\Work2> remove-item * -stream * ……代替データストリームをすべて削除してみる
PS C:\Work2>
PS C:\Work2> get-item * -stream * ……結果を確認してみる
FileName: C:\Work2\internetzonefile.exe
Stream Length
------ ------
:$DATA 65731 ……代替データストリームが削除され、メインのデータストリームしか残っていない
FileName: C:\Work2\sample_ads.txt
Stream Length
------ ------
:$DATA 6561
FileName: C:\Work2\sample_noads.txt
Stream Length
------ ------
:$DATA 19492
PS C:\Work2>
これ以外にも、Clear-Itemで代替データストリームの内容を空にしたり(代替データストリームを残したまま、そのデータ内容だけを削除して、代替データストリームのサイズを0にする)、Add-Itemで代替データストリームにデータを追加したりできる。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.