首页 > 解决方案 > 如何将文件复制到 Powershell 中的 NTFS 备用数据流中?

问题描述

我正在尝试为我在我的一门网络安全课程的教科书中看到的一个示例创建概念证明。我设置了所需的文件并尝试了它,但我只收到错误。

这是一个例子:

C:\> type C:\windows\system32\notepad.exe > c:\windows\system32\calc.exe:notepad.exe

这就是我所做的:

C:\> type c:\hello.exe > c:\README.txt:hello.exe

wherehello.exe是一个可以打印的可执行文件hello world,并且README.txt是一个包含一些随机文本的文本文件。

我得到的错误是:

out-file: The given path's format is not supported.

当第一个参数和重定向运算符之间有空格时,并且

Get-Content : A positional parameter cannot be found that accepts argument 'C:\README.txt:hello.exe'.

没有空间的时候。

我尝试用 替换typecat在运算符之间添加和删除空格,在尝试导入数据之前创建备用流,以及不同的文件类型。另外,切题的问题,我在::$DATA处理 NTFS 文件时遇到了麻烦。它只是给cat : Cannot find path 'C:\hello.exe::' because it does not exist.

标签: powershellwindows-10ntfsalternate-data-stream

解决方案


在 PowerShelltype中,cat或者gc都只是 的别名Get-Content,默认情况下与文本一起使用,因此显然您不能将它们用于二进制数据(在 cmdtype中也仅适用于文本)。要处理二进制文件,您必须使用-Encoding Byte-AsByteStream告诉 PowerShell 不要将文件作为文本处理

此外,您不能使用重定向来保存输出,因为>它只是 Out-File 的别名,它不支持流。您必须使用-Stream选项指定要存储的流Set-Content

Get-Content -Encoding Byte "C:\windows\system32\notepad.exe" | `
    Set-Content -Encoding Byte -Stream Notepad .\README.txt

事实上,PowerShell 中的许多 cmdlet,如Get-ItemGet-ContentRemove-ItemSet-ContentClear-ContentAdd-Content都可以-Stream选择对流进行操作。可惜Out-File没有这个选项

另请参阅与备用数据流交互


推荐阅读