Hostwinds 博客

寻找结果为:


Windows NTFS流 特色图片

Windows NTFS流

通过: Karlito Bonnevie  /  五月 24, 2022


自1995年以来,Microsoft Windows NTFS 文件系统具有支持的流。实际上,所有NTFS"文件"实际上都是流。我们通常认为NTFS中的文件被更精确地称为默认数据流。默认数据流未命名。什么是未命名的数据流?考虑NTF完全合格的文件名格式:

file-name:stream-name:stream-type

从左到右,我们有:

  • 文件名:"文件"的名称(即默认数据流)。
  • 流名称:任何附加的备用(命名)数据流的名称 文件名 (文件可以具有多个流)。
  • 流型:对于任何流,都表示其类型,其中$数据是最常见的。类型$数据的流可以包含普通文件可以包含的任何内容。对于可能的流类型列表,请参阅 流类型.

一个示例如下:

myTextFile.txt

这是默认数据流。如前所述,默认数据流未命名。这可以在其完全合格的文件名表格中看到:

myTextFile.txt::$DATA

两个结肠之间没有任何东西(::)表示这是一个未命名的数据流。对于默认数据流,尽管可以,但我们不需要使用完全合格的文件名。例如,从Windows命令提示符中,以下两个命令正好打开相同的默认数据流:

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

为了简化事物,我们将使用术语"文件"代替更准确的"默认数据流"。

您可以使用普通NTF在文件中创建命名流 命名约定。例如,从命令提示符中,运行以下内容:

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中没有内容是有意义的,而流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个字节回到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"作为流属性的值。流(命名数据流)将返回流的名称作为流属性的值(and:":$ data将不会返回)。
  • wher -object stream -ne':$ data'
    删除所有流属性为":$数据"的文件,从而仅保留包含一个或多个命名流的文件。
  • 转换路径
    输出格式的文件路径。

使用PowerShell删除流

从powershell命令提示符中,您可以从file foo.docx中删除stream bar.txt如下:

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

如果流名称具有空格,则必须使用引号,如以下方式:

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

使用流

NTFS流的最初意图是启用Apple Macintosh文件互操作性,但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