DeviceSync 是 Windows 设备元数据同步组件,属于 Windows Device Metadata Retrieval Client(设备元数据检索客户端)NTFS 文件流 File Stream(ADS‑Alternate Data Stream 备用数据流)完整解构,它允许在一个文件中存储多个数据流。每个数据流都可以独立地读取和写入数据,并与主数据流关联。
DeviceSync64 / DeviceSync6432 完整解构
路径
C:\ProgramData\Microsoft\DeviceSync\DeviceSync64
C:\ProgramData\Microsoft\DeviceSync\DeviceSync6432
拆解维度:底层原理|依赖文件|依赖关系|逻辑链路|配套链|边界|自动化流水线
一、底层原理
1. 组件定位
DeviceSync 是 Windows 设备元数据同步组件,属于 Windows Device Metadata Retrieval Client(设备元数据检索客户端)。
DeviceSync64:64 位任务二进制缓存目录DeviceSync6432:Wow64‑32 位兼容对应缓存目录,存放 32 位组件相关元数据缓存、任务配置、临时工作文件。
对应系统后台服务:DeviceMetadataService(设备元数据服务),服务名称:
DeviceMetadataService,显示名称:设备元数据检索服务。
核心职责:
- 从 Windows 设备元数据网络服务器下载设备元数据包(设备图标、设备描述、硬件分类信息);
- 针对 PnP 即插即用设备,匹配硬件 ID,更新设备管理器显示名称、图标;
- 将下载的元数据包解压、缓存到此
%ProgramData%\Microsoft\DeviceSync; - 区分 64 位 /32 位两套缓存目录,适配 Wow64 架构;
- 后台定时同步、设备热插拔触发同步。
目录本质:服务运行时的本地磁盘缓存目录,不是系统二进制存放目录;里面存放缓存的元数据 cab 包、解压后的 xml 元数据、图标资源、任务状态文件。
2. 目录结构说明
C:\ProgramData\Microsoft\DeviceSync
├─ DeviceSync64 # 64位系统缓存
│ ├─ *.cab # 下载回来的设备元数据压缩包
│ ├─ *.xml # 设备元数据描述文件
│ ├─ *.ico / *.png # 设备图标资源
│ └─ status.dat # 同步状态、版本标记
└─ DeviceSync6432 # 32位兼容缓存(Wow64)
3. 注册表控制点
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Device Metadata
DeviceMetadataServiceEnabledREG_DWORD:开启 / 关闭设备元数据网络下载DeviceMetadataStorePath:可重定向缓存根目录,默认指向%ProgramData%\Microsoft\DeviceSync
二、依赖文件
| 文件路径 | 作用 |
|---|---|
%SystemRoot%\System32\DeviceMetadataService.dll |
服务主体 DLL,由 svchost 加载 |
%SystemRoot%\System32\devmetadataprovider.dll |
PnP 元数据提供程序,对接设备管理器 |
%SystemRoot%\System32\winhttp.dll |
后台下载元数据包,HTTP 网络栈 |
%SystemRoot%\System32\cabview.dll |
解压 cab 元数据包 |
%SystemRoot%\System32\pnputil.exe / cfghd.dll |
PnP 设备硬件 ID 匹配逻辑 |
%SystemRoot%\System32\svchost.exe |
承载 DeviceMetadataService 服务宿主进程 |
服务宿主:
svchost.exe -k LocalSystemNetworkRestricted
三、依赖关系
1. 调用链路
DeviceMetadataService(svchost托管)
↓
devmetadataprovider.dll 接收PnP设备插入通知
↓
winhttp.dll 访问微软设备元数据云服务器下载cab包
↓
cabview.dll解压,写入 ProgramData\Microsoft\DeviceSync\DeviceSync64 / DeviceSync6432
↓
cfghd.dll / PnP子系统读取缓存内xml、图标,更新设备管理器UI显示
2. 服务依赖
服务 DeviceMetadataService
- 依赖:
RpcSs(RPC)、WinHttp网络组件; - 启动类型:默认手动 (Trigger‑Start,触发启动);设备热插拔事件触发启动,完成任务后空闲停止。
3. 文件系统权限依赖
C:\ProgramData\Microsoft\DeviceSync
- 所有者:
NT AUTHORITY\SYSTEM - 需要 SYSTEM 用户读写权限;权限损坏会导致元数据无法缓存,设备管理器图标显示为默认问号图标。
4. 事件日志
Microsoft‑Windows‑DeviceMetadataService/Operational 记录:下载、缓存写入、硬件 ID 匹配、下载失败、目录访问错误。
四、完整逻辑链路 Mermaid
sequenceDiagram
participant PnP[PnP子系统 设备热插拔]
participant SvcHost[svchost.exe DeviceMetadataService]
participant DevMetaDll[DeviceMetadataService.dll]
participant Winhttp[winhttp.dll]
participant MSCloud[微软设备元数据服务器]
participant CabDll[cabview.dll]
participant Disk[ProgramData\DeviceSync 缓存目录]
participant DevMgr[设备管理器 UI]
PnP->>SvcHost: PnP设备插入,触发启动DeviceMetadataService
SvcHost->>DevMetaDll: 服务初始化
DevMetaDll->>DevMetaDll: 读取硬件ID,查询本地缓存DeviceSync64/6432
alt 本地缓存存在有效元数据
DevMetaDll->>Disk: 读取本地xml、图标
else 本地无缓存/版本过期
DevMetaDll->>Winhttp: HTTP请求下载设备元数据CAB包
alt 网络下载成功
Winhttp-->>DevMetaDll: 返回cab数据包
DevMetaDll->>CabDll: 解压cab包
DevMetaDll->>Disk: 写入DeviceSync64 / DeviceSync6432缓存目录
else 下载失败(网络/策略阻断)
DevMetaDll->>DevMetaDll: 使用系统内置默认设备图标
end
end
DevMetaDll-->>DevMgr: 将元数据(名称、图标)提交PnP设备实例
DevMgr->>DevMgr: 更新设备管理器显示
SvcHost->>SvcHost: 一段时间空闲后停止服务
五、配套链
1. 服务控制命令
:: 查询服务状态
sc query DeviceMetadataService
:: 手动触发运行
sc start DeviceMetadataService
:: 停止服务
sc stop DeviceMetadataService
2. 注册表控制开关
# 关闭设备元数据网络下载(仅使用本地缓存)
Set‑ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Device Metadata" -Name "DeviceMetadataServiceEnabled" -Value 0 -PropertyType DWord -Force
3. 运维场景
- 设备管理器设备全部显示问号默认图标:缓存目录权限损坏、服务被禁用、网络阻断元数据服务器;
- 磁盘占用:
ProgramData\Microsoft\DeviceSync缓存堆积大量旧 cab 包; - 隔离环境内网机器:无法访问微软元数据服务器,只能使用系统默认图标;
- 镜像部署:封装系统时可预填充 DeviceSync64 缓存,实现离线设备图标展示。
六、边界(坑、约束)
- ❗
DeviceSync64/DeviceSync6432是缓存目录,不是可执行程序,目录内没有 exe/dll 主体文件;主体 DLL 位于 System32。 - ❗ 服务是触发式启动,不是常驻;设备插拔才会运行,平时处于停止状态。
- ❗ 网络访问目标为微软公网元数据服务器;内网隔离环境无法下载,不会报错,直接回退默认图标。
- ❗ 目录 ACL 权限损坏:SYSTEM 无读写权限,会静默失败,事件日志才能看到报错,设备管理器只显示默认图标。
- ❗ 清理目录不会破坏系统;删除缓存后,下次设备插入会重新下载。
- ❗ 组策略 / 防火墙阻断访问元数据服务器,无弹窗提示,仅事件日志记录。
- ❗ DeviceSync6432 用于 32 位遗留设备元数据兼容,纯 64 位硬件不一定产生该目录。
- ❗ 修改注册表关闭
DeviceMetadataServiceEnabled=0:不再联网下载,但仍然读取已存在本地缓存。
七、自动化流水线(可直接投产 PowerShell)
功能:目录权限校验、服务状态检查、事件日志采集、缓存清理、开关元数据服务
<#
DeviceSync 缓存目录诊断流水线
#Requires‑RunAsAdministrator
#>
$reportFile = ".\DeviceSync_$(Get‑Date -Format yyyyMMdd_HHmmss).log"
$cacheRoot = "$env:ProgramData\Microsoft\DeviceSync"
$dir64 = Join‑Path $cacheRoot "DeviceSync64"
$dir32 = Join‑Path $cacheRoot "DeviceSync6432"
function Write‑Report{
param($msg)
$line = "[$(Get‑Date‑Format HH:mm:ss)] $msg"
Write‑Host $line
$line | Out‑File $reportFile ‑Append
}
Write‑Report "==== DeviceSync 元数据缓存诊断 ===="
#1 目录检测
Write‑Report "`n[1]缓存目录检测"
foreach($d in @($dir64,$dir32)){
if(Test‑Path $d){
Write‑Report ("存在目录:$d")
Get‑Acl $d | Out‑File $reportFile ‑Append
$size = (Get‑ChildItem $d ‑Recurse ‑ErrorAction SilentlyContinue | Measure‑Object Length ‑Sum).Sum
Write‑Report ("目录总大小(bytes): $size")
}else{
Write‑Report ("目录不存在:$d")
}
}
#2 服务状态
Write‑Report "`n[2] DeviceMetadataService 服务状态"
Get‑Service DeviceMetadataService | Select‑Object Name,Status,StartType | Out‑File $reportFile ‑Append
#3 注册表配置
Write‑Report "`n[3]设备元数据注册表配置"
$regPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Device Metadata"
if(Test‑Path $regPath){
Get‑ItemProperty $regPath | Out‑File $reportFile ‑Append
}
#4 采集事件日志
Write‑Report "`n[4] DeviceMetadataService 事件日志(120条)"
Get‑WinEvent -LogName Microsoft‑Windows‑DeviceMetadataService/Operational ‑MaxEvents 120 ‑ErrorAction SilentlyContinue |
Select‑Object TimeCreated,Id,Message | Format‑List | Out‑File $reportFile ‑Append
Write‑Report "✅报告输出:$reportFile"
<#
#可选操作:清理缓存目录,谨慎执行
#Stop‑Service DeviceMetadataService ‑Force
#Remove‑Item "$dir64\*" ‑Recurse ‑Force ‑ErrorAction SilentlyContinue
#Remove‑Item "$dir32\*" ‑Recurse ‑Force ‑ErrorAction SilentlyContinue
#Start‑Service DeviceMetadataService
#>
NTFS 文件流 File Stream(ADS‑Alternate Data Stream 备用数据流)完整解构
NTFS 文件模型:一个 MFT 记录(一个文件名对象)可以拥有多个独立 $DATA 属性,每一个 $DATA 属性就是一条数据流。 默认数据流:
::$DATA,普通资源管理器读写的主文件内容;额外附加的称为备用数据流 ADS(Alternate Data Stream)。 语法格式:文件名:流名:$DATA。示例:note.txt:secret:$DATA。 注意:目录也可以挂载 ADS 数据流,不止普通文件。
一、底层原理
1. 内核存储模型
- MFT 记录内可以存在多条类型为
$DATA的属性;每个 $DATA 属性拥有自己的流名称; - 无名称的
$DATA= 主数据流(Windows 资源管理器、type、notepad 默认访问); - 带名字的
$DATA= 备用数据流 ADS; - 每条数据流独立:拥有自己的常驻 / 非常驻状态、独立 run‑list 簇映射、独立大小;
- 全部数据流归属同一个 MFT 记录;删除文件名,该 MFT 记录下全部数据流一起被标记空闲。
ADS 不是独立文件,不产生新 MFT 条目;不生成新目录索引条目;普通 dir、资源管理器默认看不到 ADS。
2. 常驻 / 非常驻同样适用于 ADS
- 小 ADS 流:数据直接驻留在 MFT 记录内部(Resident),不占用外部磁盘簇;
- 大 ADS 流:变成非常驻 Non‑Resident,分配磁盘簇,run‑list 记录簇位置。
3. 关键内核处理逻辑
- 创建 ADS:调用
CreateFileW传入完整格式file:streamname:$DATA;ntfs.sys 在现有 MFT 记录上新增一条$DATA属性; - 读写 ADS:
WriteFile / ReadFile,内核直接操作该条 $DATA 属性,不改动主数据流; - 删除单条 ADS 流:使用
DeleteFileW指定文件名:流名:$DATA;只删除这一条 $DATA 属性,主文件本体不会删除; - 删除主文件:
DeleteFileW删除文件名,MFT 记录标记空闲,该 MFT 下所有 ADS 全部一并失效残留。
重要:复制、移动文件行为对 ADS 的处理由上层 API 决定,不是 ntfs.sys 强制。
完整逻辑链路
应用层 CreateFileW("test.txt:mysecret:$DATA")
↓
ntdll.dll NtCreateFile 系统调用
↓
I/O管理器 → ntfs.sys内核驱动
↓
ntfs.sys查找目标MFT记录
│ 1. 查找该MFT记录内是否已经存在同名$DATA流
│ 2. 不存在:新增一条$DATA属性;判断大小,选择常驻MFT / 分配外部簇
│ 3. 存在:打开已有$DATA流句柄
│ 4. WriteFile → 将数据写入该$DATA属性
│ 5. 修改操作记入 $LogFile 事务日志
│ 6. 更新 $Bitmap 簇位图(非常驻流才会修改)
【删除单条ADS流链路】
DeleteFileW("test.txt:mysecret:$DATA")
↓
ntfs.sys:移除MFT记录中指定名称的$DATA属性;释放对应簇;**主文件MFT记录继续保留**
【删除主文件链路】
DeleteFileW("test.txt")
↓
ntfs.sys标记MFT记录整体为FREE;主数据流 + 全部ADS数据流全部标记空闲,内容残留磁盘
二、依赖文件 / 元对象
表格
| 对象 | 说明 |
|---|---|
ntfs.sys |
C:\Windows\System32\drivers\ntfs.sys;数据流全部解析、分配、删除逻辑在内核驱动实现 |
$MFT |
MFT 记录,所有 $DATA(主流 + ADS)存储在对应 MFT 记录的属性列表 |
$LogFile |
NTFS 事务日志;新增 / 修改 / 删除 ADS 流,写入事务日志,保障断电一致性 |
$Bitmap |
簇位图;ADS 如果是非常驻,分配释放簇时更新位图 |
fsutil.exe |
用户态工具,通过 DeviceIoControl 下发 IOCTL,枚举、查询数据流信息 |
注册表:无专门注册表;ADS 属于 NTFS 原生文件模型,无法通过注册表关闭 ADS 功能。
⚠️ ReFS 同样支持备用数据流 ADS,机制类似;FAT32 完全不支持多数据流。
三、配套链、命令、API、上层行为
1. 原生命令
# 写入ADS流
echo 这是秘密内容 > test.txt:hidden:$DATA
# 读取ADS流
more < test.txt:hidden:$DATA
# 枚举文件所有数据流
fsutil file querystreams test.txt
# 删除单条ADS流
del test.txt:hidden:$DATA
PowerShell 操作 ADS
# 写入
Set‑Content test.txt:hidden -Value "secret data" -Stream hidden
# 枚举流
Get‑Item test.txt -Stream *
# 删除流
Remove‑Item test.txt:hidden -Stream hidden
2. Win32 / Nt API
CreateFileW:传入FileName:StreamName:$DATA打开指定数据流;ReadFile / WriteFile:对 ADS 句柄读写;DeleteFileW:删除单条 ADS 流;- DeviceIoControl
FSCTL_ENUM_ALTERNATE_DATA_STREAMS:枚举一个文件全部数据流,fsutil 内部调用该 IOCTL。
上层应用配套行为
- Windows 资源管理器、dir 默认不显示 ADS;文件大小只显示主数据流大小,ADS 占用磁盘空间不会在 UI 体现;
- 浏览器下载标记:
Zone.Identifier:$DATA经典 ADS;标记文件来自互联网,打开触发安全警告; - 杀毒软件:扫描 ADS 流,恶意代码可以隐藏在 ADS 中;
- 复制行为差异:
copy命令:默认丢弃 ADS,只复制主数据流;xcopy /O、robocopy、PowerShell Copy‑Item:可以保留 ADS 数据流;- SMB 共享传输:默认会传输 ADS;
- 拷贝到 FAT32:ADS 直接丢失。
- 备份软件:需要专门逻辑备份 ADS,否则备份恢复会丢失备用流。
四、边界、限制、坑点
✅支持
- 文件、目录对象都可以附加 ADS 备用数据流;
- ADS 流可以常驻 MFT 内部(小流不占用外部簇),也可以非常驻占用磁盘簇;
- 支持单独删除某一条 ADS 流,不影响主文件;
- ReFS 兼容 ADS;SMB 协议支持跨网络传输 ADS;
- 同一个 MFT 记录可以附加多条不同名称 ADS 流。
❌关键边界与限制
- 不能关闭 ADS 功能:ADS 是 NTFS 文件模型原生能力,没有开关可以禁用;只能依靠上层应用过滤。
- 普通
copy命令复制文件会丢弃 ADS;很多老旧备份工具不会备份 ADS,恢复丢失。 - 资源管理器、dir 不展示 ADS 占用磁盘空间;容易出现:文件夹属性统计大小远小于实际磁盘占用(大量 ADS)。
- ADS 流没有独立安全描述符;ADS 继承主 MFT 记录的安全描述符 ACL,不能单独给 ADS 设置权限。
- 删除 ADS 流:仅删除该 $DATA 属性;删除主文件 MFT 记录,全部 ADS 一起残留磁盘;SDelete 仅处理主数据流,不会自动擦除 ADS 数据流。
- 压缩、稀疏属性:ADS 流可以独立设置压缩 / 稀疏属性,和主数据流互不干扰。
- 命名约束:流名不能包含
:冒号;完整打开必须后缀:$DATA;省略:$DATA系统依然可以识别。 - 迁移到非 NTFS 介质(FAT32、exFAT):ADS 直接全部丢弃,不会告警。
典型故障现象
- 文件复制之后 Zone.Identifier 安全标记消失:copy 命令丢弃 ADS,改用 robocopy。
- 磁盘占用很高,但文件总大小统计很小:大量 ADS 备用数据流占用簇。
- 恶意样本把可执行程序放在 ADS 流:explorer 不能直接执行 ADS 流,需要 type 或者重定向导出后执行。
- 删除 ADS 流之后磁盘空间不释放:ADS 是常驻 MFT 内小流,没有外部簇,因此不会释放簇空间。
记忆链路: NTFS 每个 MFT 记录可以有多条
$DATA属性;无名为主数据流,命名的就是 ADS 备用数据流;目录也支持 ADS;全部逻辑在ntfs.sys内核;单条 ADS 可单独删除;普通 copy 会丢弃 ADS;FAT32 不支持,ReFS 支持;ADS 没有独立 ACL;SDelete 不会自动处理 ADS;Zone.Identifier 是系统最常见 ADS。
NTFS 文件流($DATA 数据流 / ADS 备用数据流)完整演进拆解
$DATA(0x80)为数据属性;无名\(DATA=主文件流,带名称\)DATA=ADS 备用数据流,全部挂载在同一条 MFT 记录内。一、核心基础概念定义
1.1 两种数据流形态
- Main Stream(主数据流)
无名称的
$DATA属性,路径直接写文件名即可访问,test.txt等价于test.txt::$DATA,是资源管理器、CMD 正常读取的文件主体内容。 - ADS Alternate Data Stream(备用数据流)
带自定义名称的
$DATA属性,访问语法:文件名:流名[:$DATA],例installer.exe:Zone.Identifier、doc.txt:secret_log;同一文件可挂载数十条 ADS,共享 MFT 基础属性(ACL、文件名、创建时间),但每条数据流独立拥有:大小、修改时间、压缩 / 稀疏 / EFS 属性、文件句柄锁。
1.2 关键边界区分
- 数据流依附于单个 MFT 文件记录,删除主文件则全部 ADS 一同销毁;
- FAT32/exFAT/ReFS完全不支持 ADS,跨分区复制会直接丢弃所有备用数据流,仅保留主流;
- ADS 不属于重解析点、硬链接,是原生多数据属性存储。
二、分阶段完整演进(按 NTFS 版本 + Windows 版本划分)
阶段 1:萌芽期 Windows NT 3.1 / NTFS 1.0(1993):仅单一主数据流,无 ADS
- MFT 仅支持单条无名 $DATA 属性,所有文件仅有唯一内容流;
- 设计目标:替代 FAT 固定结构,用属性化存储实现权限、时间戳、基础数据;
- 缺失能力:无法附加额外数据、无法兼容 Macintosh HFS 双分叉(数据分叉 + 资源分叉);
- 无任何系统级附加数据流使用场景。
阶段 2:正式落地期 Windows NT 3.5 / 3.51 / NTFS 1.1(1995):ADS 多数据流原生诞生(里程碑)
底层结构性升级
- MFT 属性
$DATA(0x80)支持多条同名属性、区分属性名称,实现一个 MFT 记录挂载多个独立数据流,ADS 正式落地; - MFT 头部增加 USN 校验,保障多属性元数据断电一致性;
- 同时配套 NTFS 压缩、稀疏文件,每条数据流可独立开启压缩 / 稀疏,精细化空间管控。
初代设计目的(唯一业务导向)
- Mac 文件分为「数据分叉(主体文件)+ 资源分叉(图标、菜单、程序资源)」;
- NTFS 用主数据流承载 Mac 数据分叉,ADS 命名流存储资源分叉,实现 Mac 文件直接在 NTFS 分区读写互通。
初代限制
- 无系统内置工具管理 ADS,仅后端 SFM 组件调用;
- 无 CMD 原生读写语法,仅原生 Win32 API
CreateFileW("file:stream")操作; - 普通用户无感知,几乎无民用场景。
阶段 3:功能拓展期 Windows 2000 / NTFS 3.0(2000):ADS 纳入系统基础服务
- 系统索引服务:用 ADS 存储文件摘要、关键词索引,不污染主文件内容;
- 资源管理器缩略图缓存:图片文件附加
Thumbnail命名 ADS,缓存缩略图加速预览; - IIS Web 服务器:早期 IIS 使用 ADS 存储脚本源文件、隐藏后端脚本;
- 工具补齐:Sysinternals 发布
Streams.exe,第一款公开 ADS 查看 / 删除工具,运维人员可排查隐藏流。
阶段 4:全民普及期 Windows XP / Server2003 / NTFS 3.1(2001,磁盘格式永久定型)
标志性功能:Zone.Identifier 安全标记流(影响至今)
Zone.IdentifierADS 流,写入区域编号:- ZoneId=0:本机;ZoneId=1:本地内网;ZoneId=2:信任站点;ZoneId=3:互联网;ZoneId=4:受限站点。
系统行为:
- 打开 ZoneId=3 的 EXE 时,弹出「此文件来自互联网,可能存在风险」安全提示;
- 用户勾选「解除锁定」,系统直接删除
Zone.IdentifierADS,提示消失。这是普通用户唯一能直观接触到的原生 NTFS 数据流。
XP 阶段其他迭代
cmd.exe原生支持冒号路径读写 ADS,可直接用type、echo创建隐藏数据流;cmdecho 隐藏内容 > test.txt:hiddenstream- 备份 API
BackupRead/BackupWrite完整遍历所有数据流,NTBackup 备份完整保留 ADS; - 暴露安全隐患:黑客发现 ADS 可隐藏可执行程序、后门、配置文件,主流杀毒软件仅扫描主数据流,ADS 免杀初见雏形。
阶段 5:安全加固期 Vista / Server2008(2007):边界管控、防止 ADS 恶意滥用
- UAC 权限联动:高权限程序强制校验
Zone.Identifier流,阻断互联网来源高危程序静默执行; - 复制行为优化:资源管理器跨文件系统(NTFS→U 盘 FAT32)弹出提示「备用数据流将丢失」,XP 无任何提示直接销毁;
- NTFS 驱动
ntfs.sys加固:禁止通过 ADS 路径绕过目录权限校验,封堵路径劫持漏洞; - 卷影副本 VSS 完整快照全部 ADS 数据流,取证备份完整性提升。
阶段 6:运维易用化 Win7~Win8.1(2009–2014)
- Robocopy 新增
/STREAMS参数,复制时完整保留全部备用数据流,适配服务器文件迁移; - 微软文档明确标注 ADS 安全风险,推荐管理员定期扫描分区异常 ADS;
- 无底层磁盘改动,以兼容性、运维工具优化为主。
阶段 7:现代化原生支持 Win10 1703+(2017):PowerShell 原生 ADS 命令 + 安全审计
核心升级:PowerShell 3.0 及以上内置全套数据流管理 Cmdlet,告别第三方工具依赖
# 查看文件所有数据流
Get-Item .\file.exe -Stream *
# 读取Zone标识流
Get-Content .\file.exe -Stream Zone.Identifier
# 删除指定ADS
Remove-Item .\file.exe -Stream Zone.Identifier
安全侧重大升级
- Sysmon 事件 ID 15:专门记录备用数据流创建事件,EDR、SIEM 可直接监控恶意 ADS 落地行为;
- Windows Defender 全盘扫描包含 ADS 数据流查杀,解决传统杀毒遗漏隐藏流问题;
- WSL1 兼容 NTFS ADS,Linux 侧可挂载识别 Windows 命名数据流。
阶段 8:Win11 21H2~2026 预览版:云存储融合、遗留特性收敛
- OneDrive 占位文件、云文件依托重解析点实现,不再复用 ADS(ADS 逐步退出系统元数据场景);
- 无新增 ADS 底层功能,微软倾向弱化 ADS 原生业务使用,仅维持向下兼容;
- ReFS 持续不支持 ADS,新一代文件系统彻底放弃多数据流设计;
- 仅
Zone.Identifier安全标记保留为唯一系统默认 ADS 使用场景。
三、底层存储完整解构(MFT + 数据流物理结构)
3.1 MFT 内部存储结构
$DATA(0x80)属性区分:- 无名 $DATA:主文件内容,常规读写入口;
- 命名 $DATA:Zone.Identifier:安全标记流;
- 命名 $DATA:Thumbnail:缩略图缓存流。
常驻 / 非常驻存储规则(和主流完全一致)
- 小体积 ADS(<700 字节):常驻属性,数据直接存放在 MFT 记录内部,不占用磁盘簇,删除文件后 MFT 残留极易被取证恢复;
- 大体积 ADS:非常驻属性,通过 RunList 簇链表分配磁盘空间,独立碎片、独立压缩状态。
3.2 数据流完整 I/O 生命周期链路
新建
已存在
应用CreateFile打开file.txt:hidden
ntfs.sys解析冒号分隔流名称
检索MFT内对应命名$DATA属性
数据流是否存在?
新增一条命名$DATA属性写入MFT
直接绑定该数据流句柄
读写操作独立作用于当前ADS,不修改主流
$LogFile写入NTFS事务日志,保障元数据一致性
新建
已存在
应用CreateFile打开file.txt:hidden
ntfs.sys解析冒号分隔流名称
检索MFT内对应命名$DATA属性
数据流是否存在?
新增一条命名$DATA属性写入MFT
直接绑定该数据流句柄
读写操作独立作用于当前ADS,不修改主流
$LogFile写入NTFS事务日志,保障元数据一致性
四、全链路依赖组件梳理
4.1 内核核心依赖
ntfs.sys:解析冒号路径、多$DATA属性寻址、数据流压缩 / 稀疏处理、ADS 创建销毁;ntoskrnl.exeI/O 管理器:处理带流名称的 IRP 请求;- NTFS 卷元文件
元文件 数据流相关作用 $MFT所有主 / 备用数据流的属性存储载体,核心 $LogFile数据流属性修改事务日志,断电防损坏 $Bitmap为大体积 ADS 分配 / 回收磁盘簇
4.2 用户态操作入口
- CMD 原生:
echo、type、more冒号路径读写; - PowerShell:
-Stream全套原生命令(Win10 主推); - Sysinternals
Streams.exe:批量扫描、清理 ADS(经典运维工具); - Win32 API:
CreateFileW、FindFirstStreamW(枚举所有数据流)。
4.3 互斥与兼容约束
- 单条数据流可独立 EFS 加密、NTFS 压缩;同一文件主流加密、ADS 可不加密,粒度极细;
- 符号链接、Junction自身无法挂载 ADS,重解析点文件禁止附加备用数据流;
- 移动 / 剪切同 NTFS 分区:ADS 完整保留;复制到非 NTFS:ADS 直接丢弃;
- 目录同样支持 ADS(文件夹可附加隐藏数据流)。
五、典型故障与风险传导链路
故障 1:文件复制到 U 盘后,解压 / 程序功能异常
Robocopy /STREAMS。故障 2:恶意软件利用 ADS 隐藏后门,常规查杀无法发现
malware.exe:hiddenpayload启动隐藏流内 EXE → 进程路径指向正常文件 → 传统文件扫描无异常。
故障 3:磁盘 CHKDSK 扫描后 ADS 丢失
$DATA属性直接清理,Win10/11 磁盘校验可修复 ADS 元数据。故障 4:文件删除后,MFT 常驻 ADS 残留泄露敏感信息
六、演进设计哲学总结
- 适配先行:初代 ADS 为解决 Mac 跨平台兼容,是典型异构文件系统适配方案;
- 功能复用:兼容需求弱化后,复用 ADS 承载系统安全标记、索引、缩略图,避免修改主文件;
- 格式冻结:NTFS3.1 之后锁定磁盘结构,ADS 存储格式二十年不变,保障老旧文件系统向下兼容;
- 安全收敛:早期无管控导致恶意滥用,后期通过 API、日志、杀毒扫描补齐安全短板;
- 逐步退场:现代 Windows 使用重解析点、扩展属性替代 ADS 做元数据存储,ADS 仅保留 Zone 安全标记作为遗留兼容特性,不再新增业务场景。
七、运维实用操作命令
:: CMD查看文件ADS
streams.exe file.exe
:: CMD清除全部ADS
streams.exe -s -d C:\Downloads
:: PowerShell查看所有流
Get-Item target.exe -Stream *
:: 解除网络锁定(删除Zone流)
Remove-Item target.exe -Stream Zone.Identifier
:: 完整拷贝保留ADS
robocopy D:\src E:\dst /E /STREAMS
NTFS 文件流($DATA 主数据流 + ADS 备用数据流)完整底层解构
一、核心基础定义与架构根基
$DATA(0x80)属性专门承载文件二进制内容,分为两类:- 默认主数据流(Main Stream):无属性名称的
$DATA,直接用文件名访问,test.exe等价于test.exe::$DATA,资源管理器、CMD 默认只展示此流的大小与内容。 - 备用数据流 ADS(Alternate Data Stream):带自定义名称的
$DATA属性,访问语法:文件名:流名[:$DATA],例如file.exe:Zone.Identifier、doc.txt:secret_log。
核心特征对比
| 维度 | 主数据流(无名 $DATA) | ADS 备用数据流(命名 $DATA) |
|---|---|---|
| 存储载体 | MFT 内无名$DATA属性 |
同一条 MFT 记录内多条带名称$DATA属性 |
| 可见性 | 常规文件操作可见 | Explorer/dir 默认隐藏,需专用 API / 工具枚举 |
| 独立属性 | 压缩、稀疏、EFS 加密、时间戳独立 | 每条 ADS 可独立开启压缩 / 稀疏 / EFS 加密,互不干扰 |
| 生命周期 | 删除主 MFT 全部销毁 | 依附主文件,主文件删除则 ADS 全部丢失 |
| 权限控制 | 继承文件整体 ACL | 无独立 ACL,拥有文件读取权限即可读取全部 ADS |
二、MFT 底层存储结构拆解(数据流物理落地形态)
$STANDARD_INFORMATION、$FILE_NAME、多条$DATA、$SECURITY_DESCRIPTOR等)。2.1 $DATA 属性头部通用结构
[属性类型:0x80][属性总长度][常驻标记(0=常驻/1=非常驻)][名称长度][名称偏移][数据内容/数据运行链表]
- 无名主数据流:名称长度 = 0;
- ADS 备用流:名称长度 > 0,存储 Unicode 流名称(
Zone.Identifier、Thumbnail等)。
2.2 常驻(Resident)/ 非常驻(Non-Resident)存储规则(决定磁盘布局)
- 常驻数据流(≤700 字节左右)
二进制数据直接存放在 MFT 记录内部,不占用磁盘簇;优势是寻址极快,缺点:文件删除后 MFT 未被覆盖时,取证可直接还原 ADS 明文(典型场景:
Zone.Identifier安全标记流)。 - 非常驻数据流(大体积 ADS / 主文件)
MFT 内仅保存Data Run(数据运行链表),记录磁盘簇起始 LCN、连续簇数量,实际数据存储在分区普通簇;支持碎片化、NTFS 压缩、稀疏文件按需分配簇空间。
2.3 目录同样支持 ADS
$DATA数据流,目录 ADS 无法通过常规目录读写操作访问,仅可通过CreateFile打开目录路径 + 流名称写入隐藏数据。三、内核 I/O 完整逻辑链路(数据流创建、读写、删除全流程)
ntfs.sys是数据流解析核心驱动。链路 1:创建 ADS 数据流(CMD/PowerShell/Win32 API)
链路 2:读取数据流内核解析流程
- 应用打开带冒号路径 → NTFS 驱动切割路径与流名;
- 在 MFT 属性链表精准匹配对应名称的
$DATA属性; - 常驻流直接从 MFT 读取,非常驻流解析 Data Run 读取磁盘簇;
- 原始数据返回应用,上层程序无感知底层是主流还是 ADS。
链路 3:删除数据流两种行为
- 删除主文件(
del test.txt):操作系统直接释放整条 MFT 记录,主流 + 所有 ADS 全部销毁,簇空间回收; - 单独删除 ADS(
streams -d/ PowerShellRemove-Item -Stream):仅在 MFT 属性链移除对应命名$DATA属性,主文件、主流完全保留。
链路 4:文件复制对 ADS 的处理逻辑
- 同 NTFS 分区剪切:仅修改目录 B 树索引,MFT 整体保留,ADS100% 完整留存;
- NTFS→NTFS 普通复制(Explorer/copy 命令):丢弃全部 ADS,仅复制主数据流;
- Robocopy /STREAMS:遍历所有
$DATA属性,完整复制主流 + 全部 ADS; - NTFS→FAT32/exFAT/ReFS:目标文件系统无 ADS 能力,内核强制展开 ADS 并丢弃,无任何告警(Vista 开始复制时弹出提示)。
四、全链路依赖组件(内核驱动 + NTFS 系统元文件 + 用户态工具)
4.1 内核核心依赖驱动
ntfs.sys:核心中枢,完成路径冒号解析、MFT$DATA属性寻址、常驻 / 非常驻 IO、压缩 / 稀疏 / EFS 属性控制、ADS 事务写入;- I/O 管理器(ntoskrnl.exe):承接上层文件 API,封装 IRP 下发、句柄管理;
- 过滤驱动(EDR / 杀毒):通过 IRP 回调枚举 ADS 数据流,实现恶意隐藏流查杀。
4.2 NTFS 卷系统元文件(数据流存储一致性依赖)
| 系统元文件 | MFT 编号 | 数据流相关核心作用 |
|---|---|---|
$MFT |
0 | 所有主文件、ADS 数据流的元数据载体,核心存储底座 |
$MFTMirr |
1 | MFT 前 4 条记录镜像备份,MFT 损坏时恢复数据流结构 |
$LogFile |
2 | 数据流创建、删除、扩容全部写入事务日志,断电崩溃后回滚修复 MFT 属性链,防止 ADS 元数据损坏 |
$Bitmap |
6 | 管理分区簇分配,为非常驻 ADS 分配 / 释放磁盘簇空间 |
$UsnJrnl |
日志流 | 记录 ADS 新增、删除变更日志,用于日志审计、EDR 告警 |
4.3 用户态操作入口(三层调用体系)
1)原生 Win32 API(底层通用接口)
CreateFileW:打开指定数据流(核心接口,CMD/PowerShell 均基于此封装);FindFirstStreamW / FindNextStreamW:枚举文件全部数据流(系统枚举底层 API);BackupRead/BackupWrite:NT 备份专用,遍历全部 ADS 用于整机备份。
2)CMD 原生操作
:: 创建ADS
echo secret > demo.txt:my_stream
:: 读取ADS
type demo.txt:my_stream
:: Sysinternals经典工具:扫描+清理ADS
streams64 C:\Downloads
streams64 -s -d C:\Temp 递归删除所有ADS
3)PowerShell 原生命令(Win10 1703 + 官方原生支持)
# 列出文件全部数据流
Get-Item target.exe -Stream *
# 读取Zone安全标记流
Get-Content target.exe -Stream Zone.Identifier
# 单独删除指定ADS(解除互联网锁定)
Remove-Item target.exe -Stream Zone.Identifier
五、关键约束、互斥关系与兼容性边界
5.1 属性互斥规则
- 符号链接(SymbolicLink)/Junction 联接禁止挂载 ADS
带有
$REPARSE_POINT(0xC0)重解析点属性的文件,NTFS 禁止新增命名$DATA数据流,底层属性结构冲突。 - ADS 可与 NTFS 压缩、稀疏文件、EFS 加密共存
单文件内:主流未加密,某条 ADS 可以单独开启 EFS 加密;大体积 ADS 可设置稀疏文件,空数据不占用磁盘簇。
5.2 跨文件系统兼容性硬边界
- ✅ 仅 NTFS 完整支持 ADS;
- ❌ FAT16/FAT32/exFAT/ReFS/EXT4 完全不识别
$DATA命名属性,复制直接丢失 ADS; - WSL1 可原生识别 NTFS ADS,WSL2 虚拟磁盘内 EXT4 不支持数据流。
5.3 数量上限
六、典型故障与风险传导链路(底层根源→现象)
故障 1:文件拷贝到 U 盘后程序配置丢失、功能异常
robocopy /E /STREAMS完整保留数据流。故障 2:恶意软件利用 ADS 隐藏后门,常规杀毒无告警
payload.exe:hidden_backdoor.exe执行,进程路径显示为正常文件 → 主流杀毒默认仅扫描无名主数据流 → 恶意载荷长期驻留。
streams全盘扫描、Defender 开启 ADS 深度扫描。故障 3:磁盘异常断电后 ADS 消失
$LogFile事务日志 → CHKDSK 磁盘校验清理损坏的$DATA命名属性 → 备用数据流直接丢失。故障 4:文件删除后敏感信息可被取证恢复
七、Windows 原生 ADS 合法业务使用场景
- Zone.Identifier(最通用):浏览器下载文件自动写入,标记网络来源区域,SmartScreen 安全提示依据此流判断风险;
- Thumbnail 缩略图流:早期资源管理器将图片缩略图存入 ADS,加速预览加载;
- 旧版 IIS 服务器:使用 ADS 存放脚本源码、隐藏后端页面;
- Office 旧版文档:附件、批注存入文件 ADS,不污染主文档结构。
八、整体逻辑闭环总结
- 存储闭环:依托 NTFS 属性化 MFT 架构,多条
$DATA属性实现多数据流并存,常驻 / 非常驻适配大小文件,$LogFile事务保障元数据断电一致性; - IO 运行闭环:路径冒号语法拆分流名称,
ntfs.sys精准寻址对应$DATA属性,读写完全隔离各数据流; - 生命周期闭环:依附主 MFT 生存,主文件销毁则全部数据流回收,支持单流独立删除;
- 演进定位:ADS 最初为兼容 Mac HFS 资源分叉设计,后续复用为系统安全标记载体,现代 Windows 逐步用扩展属性、重解析点替代 ADS 元数据场景,仅保留 Zone.Identifier 作为遗留兼容功能。
配套运维实用命令汇总
:: 批量扫描分区ADS
streams64 -s C:\
:: 批量清理所有ADS
streams64 -s -d C:\Users
:: PowerShell查看ADS详情
Get-Item .\installer.exe -Stream * | Select-Object Stream, Length
:: 带完整数据流复制迁移
robocopy D:\Source E:\Backup /E /COPYALL /STREAMS
文件流(File Stream)是NTFS文件系统中的一个特性,它允许在一个文件中存储多个数据流。每个数据流都可以独立地读取和写入数据,并与主数据流关联。文件流在文件系统中起到存储和管理附加属性、元数据等信息的作用。
技术原理: NTFS文件系统使用文件标识符(File ID)来唯一标识每个文件。对于具有文件流的文件,每个文件流都有一个唯一的标识符,称为流名称(Stream Name)。主数据流的流名称通常为空,而其他数据流会有自定义的流名称。
运作机制: 当创建文件流时,可以使用特定的流名称来标识该数据流,并与文件关联。文件的主数据流包含了文件的主要内容,而其他数据流则用于存储额外的数据。这些额外的数据可以是附加属性、元数据、备份数据等。
在访问文件流时,需要指定文件名和流名称来唯一标识所需的数据流。可以使用操作系统提供的API或命令行工具来读取和写入数据流。例如,通过Windows命令行工具可以使用"more <filename>:<streamname>"的方式来查看指定数据流中的内容。
值得注意的是,文件流只在NTFS文件系统上可用,并且在一些较早的操作系统版本中可能不被完全支持。在使用文件流时,需要确保操作系统和应用程序的兼容性。
文件流的使用场景:
- 存储附加属性:可以使用文件流存储与文件相关的额外属性信息,例如文件的作者、版本信息等。
- 存储元数据:文件流可以用于存储文件的元数据,例如创建时间、修改时间等。
- 备份和恢复:文件流可以用于备份和还原数据,特别是在需要保留文件的历史版本或快照时。
- 数据密钥:文件流可以用于存储加密文件的密钥信息,增强数据的安全性。
总之,文件流是NTFS文件系统中的一个特性,它允许在一个文件中存储多个数据流,并与主数据流关联。通过使用文件流,可以更灵活地存储和管理文件的附加属性、元数据以及其他相关数据。
在PowerShell中,你可以使用Get-Item命令来获取文件的流信息,并使用Set-Content和Add-Content命令来写入或追加数据到文件流中。以下是一些与文件流相关的常用命令示例:
-
获取文件的流信息
powershellCopy CodeGet-Item -Path "C:\path\to\file" -Stream *这个命令将返回指定文件的所有流信息。
-Path参数指定文件路径,而-Stream *参数表示获取该文件的所有流。 -
写入数据到文件流
powershellCopy Code"Data to be written" | Set-Content -Path "C:\path\to\file:streamName"这个命令将向指定文件的特定流(使用冒号分隔文件路径和流名称)写入数据。你可以将
"Data to be written"替换为实际要写入的内容。 -
追加数据到文件流
powershellCopy Code"Data to be appended" | Add-Content -Path "C:\path\to\file:streamName"这个命令将向指定文件的特定流追加数据。同样,你可以将
"Data to be appended"替换为实际要追加的内容。 -
读取文件流中的数据
powershellCopy CodeGet-Content -Path "C:\path\to\file:streamName"这个命令将读取指定文件的特定流中的数据,并将其显示在命令行中。
-
删除文件流
powershellCopy CodeRemove-Item -Path "C:\path\to\file:streamName"这个命令将删除指定文件的特定流。
PowerShell还提供了其他一些用于处理文件流的命令和技巧,以下是其中一些:
-
查看文件的所有流
powershellCopy CodeGet-Item -Path "C:\path\to\file" | Get-ItemProperty -Name Stream*这个命令将列出指定文件的所有流,包括默认流和自定义流。
-
复制文件流
powershellCopy CodeCopy-Item -Path "C:\source\file:streamName" -Destination "C:\destination\file:streamName"这个命令将复制源文件的特定流到目标文件中。
-
重命名文件流
powershellCopy CodeRename-Item -Path "C:\path\to\file:oldStreamName" -NewName "newStreamName"这个命令将重命名指定文件的特定流。
-
导出文件流内容到文件
powershellCopy CodeGet-Content -Path "C:\path\to\file:streamName" | Out-File -FilePath "C:\path\to\output.txt"这个命令将指定文件流的内容导出到一个新文件中。
-
清空文件流内容
powershellCopy CodeClear-Content -Path "C:\path\to\file:streamName"这个命令将清空指定文件流的内容。
PowerShell还提供了一些其他用于处理文件流的命令和方法,下面是其中的一些:
-
检查文件是否包含流
powershellCopy CodeGet-Item -Path "C:\path\to\file" | Select-Object -ExpandProperty Stream*这个命令将检查指定文件是否包含流,并列出所有流的信息。
-
创建新的文件流
powershellCopy CodeNew-Item -Path "C:\path\to\file:streamName" -ItemType Stream这个命令将在指定文件中创建一个新的流。你可以替换
streamName为你想要的流名称。 -
移动文件流
powershellCopy CodeMove-Item -Path "C:\source\file:streamName" -Destination "C:\destination\file:streamName"这个命令将移动源文件中的特定流到目标文件中。
-
获取文件流的属性
powershellCopy CodeGet-Item -Path "C:\path\to\file:streamName" | Format-List *这个命令将显示特定文件流的详细属性信息,如大小、创建时间等。
-
设置文件流的属性
powershellCopy CodeSet-ItemProperty -Path "C:\path\to\file:streamName" -Name PropertyName -Value "PropertyValue"这个命令可以设置特定文件流的属性,你需要替换
PropertyName和PropertyValue为实际的属性名和值。
PowerShell还提供了一些其他用于处理文件流的命令和方法,下面是其中的一些:
-
删除文件流
powershellCopy CodeRemove-Item -Path "C:\path\to\file:streamName"这个命令将删除指定文件中的特定流。
-
将文件流内容作为参数传递给命令
powershellCopy CodeGet-Content -Path "C:\path\to\file:streamName" | ForEach-Object { command $_ }这个命令将读取指定文件流的内容,并将其作为参数传递给命令。你需要替换
command为你想要执行的命令。 -
将多个文件合并为单个流
powershellCopy CodeGet-ChildItem -Path "C:\path\to\files*" | ForEach-Object { Get-Content $_.FullName } | Out-File -FilePath "C:\path\to\output.txt"这个命令将读取指定目录下的所有文件,并将它们的内容合并为单个流。最后,将合并后的流导出到一个新文件中。
-
将文件流转储为二进制文件
powershellCopy CodeGet-Content -Path "C:\path\to\file:streamName" | Set-Content -Encoding Byte -Path "C:\path\to\output.bin"这个命令将指定文件流的内容转储为二进制文件,并将其保存到指定路径。你可以替换
output.bin为你想要的输出文件名。
PowerShell 还提供了许多其他用于处理文件流的命令和方法。以下是其中一些额外的命令和技巧:
-
复制文件流
powershellCopy CodeCopy-Item -Path "C:\source\file:streamName" -Destination "C:\destination\file:streamName"这个命令将源文件中的特定流复制到目标文件中。
-
列出文件的所有流
powershellCopy CodeGet-Item -Path "C:\path\to\file" | Get-ItemProperty -Name Stream*这个命令将列出指定文件的所有流的属性信息。
-
重命名文件流
powershellCopy CodeRename-Item -Path "C:\path\to\file:oldStreamName" -NewName "newStreamName"这个命令将重命名文件中的特定流。
-
查找包含特定流的文件
powershellCopy CodeGet-ChildItem -Path "C:\path\to\directory" -Recurse | Where-Object { $_.Stream.Length -gt 0 }这个命令将递归查找指定目录中包含流的文件,并列出它们。
-
比较两个文件流
powershellCopy CodeCompare-Object -ReferenceObject (Get-Content -Path "C:\file1:streamName") -DifferenceObject (Get-Content -Path "C:\file2:streamName")这个命令将比较两个文件中特定流的内容并显示差异。
PowerShell 还提供了其他一些用于处理文件流的命令和方法。以下是其中的一些补充:
-
导出文件流为文本文件
powershellCopy CodeGet-Content -Path "C:\path\to\file:streamName" | Out-File -FilePath "C:\path\to\output.txt"这个命令将指定文件流的内容导出到文本文件中。
-
查找指定文件流的所有文件
powershellCopy CodeGet-ChildItem -Recurse | Where-Object { $_.Stream -ne $null }这个命令将递归搜索文件系统以查找包含任何文件流的文件。
-
清空文件流
powershellCopy CodeClear-Content -Path "C:\path\to\file:streamName"这个命令将清空指定文件流的内容。
-
复制整个文件的所有流
powershellCopy CodeCopy-Item -Path "C:\source\file" -Destination "C:\destination\file" -Stream *这个命令将源文件中的所有流复制到目标文件中。
-
删除文件的特定流
powershellCopy CodeClear-Content -Path "C:\path\to\file:streamName"这个命令将删除指定文件的特定流。
PowerShell 还提供了其他一些用于处理文件流的命令和方法。以下是其中的一些补充:
-
创建新的文件流
powershellCopy Code$stream = [System.IO.File]::Create("C:\path\to\file:streamName")这个命令将创建一个新的文件流。
-
查找指定文件流的大小
powershellCopy Code(Get-Item -Path "C:\path\to\file:streamName").Length这个命令将返回指定文件流的大小。
-
修改文件流的内容
powershellCopy CodeSet-Content -Path "C:\path\to\file:streamName" -Value "New content"这个命令将修改指定文件流的内容。
-
重命名文件的特定流
powershellCopy Code$file = Get-Item -Path "C:\path\to\file" $file | Rename-Item -NewName { $_.Name -replace "oldStreamName", "newStreamName" }这个命令将重命名文件的特定流。
-
列出文件流的属性
powershellCopy Code$file = Get-Item -Path "C:\path\to\file" $file.Properties | Where-Object { $_.Name -like "Stream*" }这个命令将列出文件流的属性。
PowerShell 还提供了其他一些用于处理文件流的命令和方法。以下是其中的一些补充:
-
查找指定文件的所有流
powershellCopy CodeGet-Item -Path "C:\path\to\file" | Select-Object -ExpandProperty Streams这个命令将列出指定文件的所有文件流。
-
导入文本文件内容到文件流
powershellCopy Code$content = Get-Content -Path "C:\path\to\input.txt" Set-Content -Path "C:\path\to\file:streamName" -Value $content这个命令将从文本文件中读取内容,并将其写入指定文件流。
-
获取文件流的编码
powershellCopy Code[System.Text.Encoding]::GetEncoding((Get-Item -Path "C:\path\to\file:streamName").Stream.StreamWriter.Encoding.CodePage)这个命令将返回指定文件流的编码方式。
-
移除文件流
powershellCopy CodeRemove-Item -Path "C:\path\to\file:streamName"这个命令将删除指定文件的特定流。
-
复制文件的所有流到另一个文件
powershellCopy CodeGet-Item -Path "C:\source\file" | ForEach-Object { $_.Streams | ForEach-Object { Write-Host "Copying stream: $($_.StreamName)" $destination = "C:\destination\file:$($_.StreamName)" $_ | Select-Object -ExpandProperty Stream | Set-Content -Path $destination -Stream } }这个命令将复制源文件的所有流到目标文件。
PowerShell 还提供了其他一些用于处理文件流的命令和方法。以下是其中的一些补充:
-
查看文件的所有流信息
powershellCopy CodeGet-Item -Path "C:\path\to\file" | Get-ItemProperty -Name Stream*这个命令将列出指定文件的所有流信息。
-
将文件流内容复制到新文件
powershellCopy CodeGet-Content -Path "C:\path\to\file:streamName" -Stream streamName | Set-Content -Path "C:\path\to\newFile" -Stream newStreamName这个命令将指定文件流的内容复制到一个新文件流中。
-
将文件流内容追加到现有文件
powershellCopy CodeAdd-Content -Path "C:\path\to\existingFile" -Value (Get-Content -Path "C:\path\to\file:streamName" -Stream streamName)这个命令将文件流的内容追加到现有文件中。
-
清空文件流的内容
powershellCopy CodeSet-Content -Path "C:\path\to\file:streamName" -Value $null这个命令将清空指定文件流的内容。
-
获取文件流的类型信息
powershellCopy Code(Get-Item -Path "C:\path\to\file:streamName").GetType()这个命令将返回指定文件流的类型信息。

浙公网安备 33010602011771号