Hostwinds Blog

Zoekresultaten voor:


Windows NTFS -streams Uitgelichte afbeelding

Windows NTFS -streams

door: Karlito Bonnevie  /  mei 24, 2022


Sinds 1995, de Microsoft Windows NTFS Bestandssysteem heeft streams ondersteund.In feite zijn alle NTFS "-bestanden" eigenlijk streams.Wat we normaal als een bestand in NTFS beschouwen, wordt meer precies een standaardgegevensstroom genoemd.Een standaardgegevensstroom is niet nader genaamd.Wat is een niet nader genoemde gegevensstroom?Beschouw de NTFS volledig gekwalificeerd bestandsnaamformaat:

file-name:stream-name:stream-type

Van links naar rechts hebben we:

  • bestandsnaam: De naam van het "bestand" (d.w.z. standaardgegevensstream).
  • streamnaam: De naam van alle alternatieve (benoemde) gegevensstromen die zijn gekoppeld aan bestandsnaam (Een bestand kan meerdere streams hebben).
  • streamtype: Voor elke stream, geeft het type aan, waarbij $ gegevens het meest voorkomen.Een stroom van type $ gegevens kan alles bevatten dat een normaal bestand kan bevatten.Zie voor een lijst met mogelijke streamtypen Streamtypen.

Een voorbeeld volgt:

myTextFile.txt

Dit is een standaardgegevensstroom.Zoals vermeld, zijn standaardgegevensstromen niet genoemd.Dit is te zien in het volledig gekwalificeerde bestandsnaamformulier:

myTextFile.txt::$DATA

Het feit dat er niets is tussen de twee dikke darm (: :) geeft aan dat dit een niet nader genoemde gegevensstroom is.Voor een standaardgegevensstroom hoeven we de volledig gekwalificeerde bestandsnaam niet te gebruiken, hoewel we dat kunnen.Bijvoorbeeld, vanuit de Windows -opdrachtprompt, openen de volgende twee opdrachten precies dezelfde standaardgegevensstream:

notepad myTextFile.txt
notepad myTextFile.txt::$DATA

Om dingen te vereenvoudigen, zullen we de term "bestand" gebruiken in plaats van de meer accurate "standaardgegevensstroom".

U kunt een benoemde stream maken in een bestand met behulp van normale NTFS het benoemen van conventies.Voer bijvoorbeeld uit de opdrachtprompt het volgende uit:

notepad foo.docx:bar.txt

Selecteer Ja Op de vraag of u een nieuw bestand wilt maken.Typ vervolgens de volgende inhoud:

This is the named stream "bar.txt" that is in (attached to) the file "foo.docx".

Bewaar en verlaat Kladblok.

Wanneer u de DIR -opdracht uitvoert, ziet u een bestand met de naam FOO.DOCX, wiens grootte, interessant, 0 bytes is.Wanneer u echter de opdracht DIR /R uitvoert, ziet u de genoemde gegevensstroom die u zojuist hebt gemaakt, waarvan de grootte 80 bytes is:

Deze twee streamgroottes zijn logisch in die stream foo.docx heeft geen inhoud terwijl stream foo.docx: bar.txt heeft 80 bytes aan inhoud.Voeg als volgt om dit op te helderen, om dit te verduidelijken wat inhoud aan de standaardgegevenstream toe te voegen:

notepad foo.docx

Voer de volgende tekst in:

This is the default data stream (file) named "foo.docx", which has one named data stream attached to it, called "bar.txt".

Bewaar en verlaat Kladblok.

Voer ADR /R opnieuw uit en merk op dat de standaardgegevensstream foo.docx nu 120 bytes aan gegevens bevat:

Daarom kunnen we zien dat de twee streams 200 bytes op het volume verbruiken.Dat gezegd hebbende, het uitvoeren van het onopgesmukte DIR -commando biedt wel enigszins misleidende informatie - het houdt in dat Foo.Docx slechts 120 bytes aan gegevens bevat, wat onnauwkeurig is in de zin dat wanneer u Foo.docx verwijdert, u eigenlijk 200 bytes terug vrijgeeft aanVolume als beschikbare vrije ruimte:

del foo.docx
dir /r

De moraal van het verhaal is misschien om altijd de /R -schakelaar te gebruiken.Dat roept de vraag op, hoe vindt u alle bestanden die "verborgen" streams bevatten?Dat onderwerp wordt vervolgens besproken.

PowerShell gebruiken om streams te vinden

Als we de term "bestand" "standaardgegevensstream" en "stream" betekenen "met de naam Data Stream" betekenen, kunnen we PowerShell gebruiken om alle bestanden met streams als volgt te vinden.

Open een PowerShell -opdrachtprompt en voert optioneel de volgende opdracht uit (dit onderdrukt mogelijk irritante bestandstoegang geweigerd foutmeldingen):

$ErrorActionPreference = "SilentlyContinue"

Voer vervolgens de volgende opdrachten uit:

Get-ChildItem -Path \ -Recurse | Get-Item -Stream * | Where-Object Stream -ne ':$DATA' | Convert-Path

Voor het huidige volume retourneert dit een lijst met alle bestanden met een of meer streams.Deze PowerShell -pijplijn wordt als volgt uitgelegd:

  • Get -childItem -path \ -recurse
    Vanaf de hoofdmap (map) krijgt alle bestanden op het volume.
  • Get -item -stream *
    Krijgt alle gegevensstromen die aan een bestand zijn gekoppeld.Bestanden (naamloze gegevensstromen) retourneren ": $ data" als de waarde van de stream -eigenschap.Streams (genaamd Data Streams) retourneert de naam van de stream als de waarde van de stream -eigenschap (en ": $ data worden niet geretourneerd).
  • Waar -object stream -ne ': $ data'
    Verwijdert alle bestanden waarvan de stream -eigenschap ": $ data" is, waardoor alleen bestanden met een of meer genoemde streams bevatten.
  • Convert-path
    Uitgangen mooi opgemaakte bestandspaden.

PowerShell gebruiken om streams te verwijderen

Uit een PowerShell -opdrachtprompt kunt u de streambar.txt uit Bestand foo.docx als volgt verwijderen:

Remove-Item -Path .\foo.docx -Stream bar.txt

Als de streamnaam spaties heeft, moet u citaten gebruiken, zoals in:

Remove-Item -Path ".\Bob's Grandfather.png" -Stream "Image Info.txt"

Streams gebruiken

De oorspronkelijke bedoeling van NTFS -streams was om Apple Macintosh -bestandsinteroperabiliteit mogelijk te maken, maar NTFS -streams kunnen best handig zijn.Misschien wilt u bijvoorbeeld gedetailleerde informatie "insluiten" in Family Photo Foto -bestanden:

Als het bovenstaande afbeeldingsbestand de naam "Bob's Grandfather.png" heette, kunt u een stream (met behulp van PowerShell) toevoegen met gedetailleerde beeldinformatie, als volgt:

Set-Content -Path ".\Bob's Grandfather.png" -Stream "image-info.txt" -Value "This is Bob's grandfather (on his mother's side) in the Gold Rush Bar and Restaurant in Seattle, WA - circa 1856."

Om de afbeelding metadata te bekijken die u zojuist instelt, voert u uit:

Get-Content -Path ".\Bob's Grandfather.png" -Stream "image-info.txt"

Merk op dat het -stroomargument vereist dat u de exacte naam van de stroom kent (jokertekens zijn niet toegestaan).Bedenk dat u altijd streamnamen kunt verkrijgen met behulp van Get-Item (die jokertekens accepteert):

Get-Item -Path '.\Bob''s Grandfather.png' -Stream *

Kijk voor de gewilde streamnaam naar de stream -eigenschap in de resulterende uitvoer:

Andere toepassingen voor NTFS -streams kunnen zijn:

  • Sleutelwoorden opslaan met betrekking tot een bestand.
  • Samenvatting informatie verstrekken voor een bestand.
  • Lettertypen en/of geluiden associëren met een bestand.
  • Vrijwel elke bestandsmetadata die u kunt bedenken.

Ten slotte heeft u misschien opgemerkt dat uw volume een aantal streams met de naam Zone bevat. Identificeerder.Deze streams worden over het algemeen door Windows gebruikt voor de opslag van URL -beveiligingszones, die bepalen of een bestand moet worden vertrouwd of niet.Een voorbeeld dat laat zien hoe de inhoud van een zone te bekijken. Identificatieverstroom volgt:

Get-Content -Path .\sanders.net-May-2022.gz -Stream Zone.Identifier

En via de Windows -opdrachtprompt:

notepad sanders.net-May-2022.gz:Zone.Identifier

Hopelijk heb je dit artikel interessant gevonden;En misschien vind je een aantal interessante toepassingen voor NTFS -streams om op te starten.

Geschreven door Karlito Bonnevie  /  mei 24, 2022