dirやPowerShellでNTFSの代替データストリーム情報を表示するTech TIPS

NTFS上のファイルには、メインのデータ以外に、補助的なデータを保存するための「代替データストリーム(ADS)」という機能がある。ファイルにADSが含まれているかどうかは、dir /rコマンドやPowerShellのGet-Itemコマンドレットで確認できる。

» 2014年07月11日 17時07分 公開
[打越浩幸デジタルアドバンテージ]
「Windows TIPS」のインデックス

連載目次

対象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ではその方法を紹介する。

操作方法

dirコマンドによる操作

 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」という文字列が付いているのが代替データストリームである。ファイルによっては複数のストリームを持っていることがある。

代替データストリームの例 代替データストリームの例
「dir /r」コマンドを実行すると、代替データストリームの情報を表示できる。
  (1)「/r」オプション無しのdirコマンドの実行例。
  (2)通常のファイル(メインのデータストリーム)の情報のみが表示される。
  (3)「/r」オプションを付けて実行してみる。
  (4)基本のファイル名。
  (5)代替データストリーム名も含めたファイル名。この例では1つのファイルに5つの代替データストリームが存在している。これはInternet ExplorerでWebサイトを「ピン留め」した場合に作成されたWebサイトのショートカットファイルの例(IEのバージョンや設定によっては代替データストリームは作成されない)。
  (6)代替データストリームはそれぞれ異なるデータを保存しているため、サイズもそれぞれ異なる。ただしファイルの作成や書き込みの日付などの情報はファイル全体で1つしかない。
  (7)(設定にもよるが)インターネットゾーンからダウンロードしたファイルには、この「Zone.Identifier」情報が付けられる。
  (8)代替データストリームを2つ持つファイルの例。
  (9)代替データストリームを1つだけ持つファイルの例。これはOutlook Expressで保存したメールの例。

 代替データストリームの内容を確認するには、「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による操作

 PowerShellを使えばファイルの代替データストリーム情報を操作できる。代替データストリーム名を表示したり、削除したりするには、Get-ItemRemove-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で代替データストリームにデータを追加したりできる。

「Windows TIPS」のインデックス

Windows TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。