ADS - Alternate Data Streams in NTFS

Es ist schon ein Weile her, da hatte ich mich einmal intensiv mit diesem Thema auseinander gesetzt. Jetzt bin ich wieder darauf gestoßen, weil ich ein nettes Tool hierzu gefunden habe, den Stream Explorer. Bei der Gelegenheit erinnerte ich mich daran, dass ich per Kommando-Zeile vor nicht allzu langer Zeit irgendwas falsch eingeben hatte (ich glaube, ich wollte was auf LPT1: oder PRN: drucken) und es gab eigenartiger Weise keine Fehlermeldung. Wahrscheinlich hatte ich aus Versehen :LPT1 eingegeben oder so. Ja, da hatte ich wohl einen ADS fürs current Directory erzeugt ...

Neugierig auf das Thema geworden, schaute ich mal im Web nach, was es denn insgesamt an Neuigkeiten gibt. Ein paar Pages sind hervorzuheben:

Alternate data streams gibt als Wiki einen guten Überblick und ist eine gute Zusammenfassung für die Verwendung von ADS-Dateien per Kommando-Zeile. Leider sind die Links (der Artikel ist aus 2006) zu den Microsoft-Quellen nicht mehr stimmig. Hier findet man auch die Links zu den gängigen Tools:

  • SysInternals has a free Streams program that will enumerate streams.
  • LADS is also another free utility that enumerates streams.
  • ADS Spy a nice free GUI tool for searching and removing streams.
  • ADS Locator a free GUI tool that searches for streams.

Ebenfalls aus dem Jahre 2006 ist die PowerPoint-Präsentation zu ADS von Keith Palmgren.

Noch ein Tool ist der StreamViewer.

Ein weiteres hübsches Tool ist ADS 1.0. Der Erläuterungstext zu diesem Programm hat mich dann doch überrascht:

In Vista, but not in XP, you can open a DOS box and use dir /R to display the alternate data streams whose name is displayed in the form: file_name:stream_name:$DATA.

Das ist neu! Also schnell einmal ein Konsol-Fenster aufgemacht (natürlich mit Admin-Rechten) und ausprobiert:

dir /R

Ja, damit werden sie angezeigt, die alternate data streams - auch der vom Directory! Wer es schnell mal unter Vista im Konsol-Fenster ausprobieren möchte: Erzeugen kann man einen ADS (hier im Beispiel ads.txt genannt) einfach mit

echo "irgendwas" >datei.txt:ads.txt

oder

more <datei_rein.txt >datei.txt:ads.txt 

bzw.

type datei_rein.txt >datei.txt:ads.txt

oder mit dem Notepad

notepad datei.txt:ads.txt

Alle Stream-benutzenden Kommandos (zur Erinnerung: stdin, stdout, <, >, |) und auch selbst geschriebene Programme können mit ADS umgehen. Auch der Windows-Scripting-Host kann ein wenig mit den ADS umgehen (show_ads.vbs):

set fs = createObject("Scripting.FileSystemObject") 
set file= fs.openTextFile("datei.txt:ads.txt") 
MsgBox file.ReadAll

Leider geht auch nicht viel mehr - das Löschen oder Kopieren oder Umbenennen eines einzelnen ADS geht zum Beispiel nicht. Aber Lesen und Schreiben geht!

Es gibt vielerorts das Bedürfnis, ADS-Dateien aufzuspüren und die Streams (bis auf den Hauptstream) zu löschen. Unter Vista könnte man das nun auch auf der Kommando-Zeile halbwegs hinbekommen. Man kann die ADS zwar nicht löschen, aber ihren Inhalt schon (Länge: 0 Bytes). Die Idee lässt sich in 2 Schritten umsetzen: (1) Man erzeuge eine Liste aller ADS-Dateinamen und (2) man überschreibe diese Streams mit einer NUL-Datei.

dir /R | find "$DATA" > ADS_LISTE 
for /F "tokens=2" %i in (ADS_LISTE) do type NUL: > %i

Mit einem dir /R /S kann man auch alle Unterverzeichnisse absuchen ...

Die Frage stellt sich nun: Warum gibt es eigentlich kein(e) offiziellen Kommando-Zeilen-Tool(s) von Microsoft, mit dem/denen man die ADS löschen (bearbeiten) kann? So schwer kann das ja eigentlich nicht sein, denn sie haben doch Mark Russinovich eingekauft mit seinen Mannen und Tools: Streams zeigt ADS an und kann sie auch entfernen. Und auch  hier gibt es kostenlos die lang vermissten Tools:

cs - copy stream
ds - delete stream  
ls - list stream
rs - rename stream
sf - strip file (delete all streams)

Noch ein Hinweis, wie man in XP und Vista spezielle ADS (zone information) unterbinden kann, die einen möglicherweise daran hindern, kopierte Dateien auszuführen:

gpedit.msc
User Configuration > Administrative Templates > Windows Components > Attachment Manager
Enable: Do not preserve zone information in file attachments.

Weitere Lösungen zu diesem speziellen Problem hier.