Hostwinds Блог

Результаты поиска для:


Windows NTFS потоки Популярное изображение

Windows NTFS потоки

от: Karlito Bonnevie  /  май 24, 2022


С 1995 года Microsoft Windows NTFS Файловая система поддерживает потоки.На самом деле, все «файлы NTFS" на самом деле являются потоками.То, что мы обычно считаем файлом в NTFS, более точно называется потоком данных по умолчанию.Поток данных по умолчанию не назван.Что такое неназванный поток данных?Рассмотрим полностью квалифицированный формат файла NTFS:

file-name:stream-name:stream-type

Слева направо, у нас есть:

  • имя файла: Имя «Файл» (то есть поток данных по умолчанию).
  • Stream-name: Имя любых альтернативных (именованных) потоков данных, прикрепленных к имя файла (файл может иметь несколько потоков).
  • Тип потока: Для любого потока указывает его тип, причем данные $ являются наиболее распространенными.Поток данных типа $ может содержать все, что может содержать нормальный файл.Список возможных типов потоков см. Типы потока.

Пример следует:

myTextFile.txt

Это поток данных по умолчанию.Как уже упоминалось, потоки данных по умолчанию не названы.Это можно увидеть в его полностью квалифицированной форме файла:

myTextFile.txt::$DATA

Тот факт, что между двумя Колонами нет ничего (: :) указывает на то, что это неназванный поток данных.Для потока данных по умолчанию нам не нужно использовать полностью квалифицированное имя файла, хотя мы можем.Например, из командной строки Windows следующие две команды открывают именно тот же поток данных по умолчанию:

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

Чтобы упростить вещи, мы будем использовать термин «файл» вместо более точного «потока данных по умолчанию».

Вы можете создать именованный поток в файле, используя обычные NTFS Наименование соглашенийАнкетНапример, из командной строки запустите следующее:

notepad foo.docx:bar.txt

Выбрать да Когда спросите, хотите ли вы создать новый файл.Далее введите следующий контент:

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

Сохраните и выйдите из блокнота.

Когда вы запустите команду DIR, вы увидите файл с именем foo.docx, размер которого, что интересно, составляет 0 байтов.Однако, когда вы запустите команду Dir /R, вы увидите только что созданный поток данных, который вы только что создали, размер которого составляет 80 байтов:

Эти два размера потока имеют смысл в этом потоке foo.docx не имеют контента, в то время как Stream foo.docx: bar.txt имеет контент на 80 байтов.Чтобы помочь выяснить это, добавьте немного контента в поток данных по умолчанию следующим образом:

notepad foo.docx

Введите следующий текст:

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

Сохраните и выйдите из блокнота.

Запустите Dir /R снова и обратите внимание, что поток данных по умолчанию Foo.docx теперь содержит 120 байтов данных:

Из -за этого мы можем сказать, что два потока потребляют 200 байтов на томе.Тем не менее, запуск команды неукрашенного DIR действительно предоставляет несколько вводящую в заблуждение информацию - она подразумевает, что Foo.docx содержит только 120 байтов данных, что неточно в том смысле, что при удалении Foo.docx вы фактически выпускаете 200 байтов обратно кТом как доступный бесплатное пространство:

del foo.docx
dir /r

Возможно, мораль истории - всегда использовать переключатель /r.Возникает вопрос, как вы находите все файлы, которые содержат «скрытые» потоки?Эта тема обсуждается дальше.

Использование PowerShell для поиска потоков

Если мы позволим термину «файл» означают «поток данных по умолчанию» и «потоковое» означает «названный поток данных», то мы можем использовать PowerShell для поиска всех файлов, содержащих потоки следующим образом.

Откройте командную строку PowerShell и при желании запустите следующую команду (это подавляет, возможно, раздражающий доступ к файлу доступа к сообщениям об ошибках):

$ErrorActionPreference = "SilentlyContinue"

Далее запустите следующие команды:

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

Для текущего тома это возвращает список всех файлов, содержащих один или несколько потоков.Этот трубопровод PowerShell объясняется следующим образом:

  • Get -childitem -path \ -recurse
    Начиная с корневого каталога (папка), получает все файлы в томе.
  • Get -item -stream *
    Получает все потоки данных, связанные с файлом.Файлы (неназванные потоки данных) возвращаются »: $ Data» в качестве значения свойства потока.Streams (названные потоки данных) вернет имя потока в качестве значения свойства потока (и «: $ data не будет возвращено).
  • Где -объект поток -ne ': $ data'
    Удаляет все файлы, свойство потока,: $ Data », тем самым оставляя только файлы, содержащие один или несколько именованных потоков.
  • Конверт-пат
    Выходы красиво отформатированные пути файлов.

Использование PowerShell для удаления потоков

В командной строке PowerShell вы можете удалить потоковой bar.txt из файла foo.docx следующим образом:

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

Если у имени потока есть места, вы должны использовать кавычки, как в:

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

Используя потоки

Первоначальным намерением NTFS Streams было включение совместимости Apple Macintosh File, но потоки NTFS могут быть довольно удобными.Например, вы можете «встраивать» подробную информацию в файлах семейных фотографий:

Если приведенный выше файл изображения был назван «Дедушка Боба».

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."

Чтобы просмотреть метаданные изображения, которые вы только что установили, запустите:

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

Обратите внимание, что аргумент -stream требует, чтобы вы знали точное имя потока (подстановочные знаки не допускаются).Напомним, что вы всегда можете получить имена потоков, используя get-item (который принимает подстановочные знаки):

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

Для востребованного имени потока посмотрите на свойство потока на полученном выходе:

Другое использование потоков NTFS может включать в себя:

  • Хранение ключевых слов, связанных с файлом.
  • Предоставление сводной информации для файла.
  • Связывание шрифтов и/или звуков с помощью файла.
  • Практически любые метаданные файла, о которых вы можете подумать.

Наконец, вы, возможно, отметили, что ваш объем содержит ряд потоков с именем Zone.Identifier.Эти потоки обычно используются Windows для хранения зон безопасности URL, которые определяют, следует ли доверять файлу или нет.Пример, показывающий, как просмотреть содержимое зоны. Поток идентификатор следует:

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

И через командную строку Windows:

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

Надеюсь, вы нашли эту статью интересной;И, возможно, вы найдете некоторые интересные применения для загрузки потоков NTFS.

Написано Karlito Bonnevie  /  май 24, 2022