34

我正在尝试让 PowerShell 取消阻止 Win2K8 R2 中的文件。

有没有人有关于语法的指针?

4

13 回答 13

50

如果您使用的是 PowerShell v3,则可以使用Unblock-Filecmdlet。


“阻塞”部分只是文件的备用数据流,名为“Zone.Identifier”。您可以使用输入重定向在 CMD 中显示它(但没有其他方法可以在 CMD 中访问流):

H:\Downloads> more < test.exe:Zone.Identifier
[ZoneTransfer]
ZoneId=3

您可以dir /r在 Windows Vista 及更高版本上找到它们:

2009-10-24  12:18        54.538.056 test.exe
                                 24 test.exe:Zone.Identifier:$DATA

同样在 CMD 中,您可以通过覆盖它轻松摆脱它(这次使用输出重定向):

echo.>myDownloadedFile.exe:Zone.Identifier

这与完全删除 ADS不太一样,但在 Explorer 中工作不会再抱怨了。

似乎没有原生支持从 PowerShell 中处理 ADS(如 PowerShell Guy 的博客中所述。该文章还包含一些如何在 PowerShell 中获取该功能的信息)。但是,您可以简单地调用 cmd:

cmd /c "echo.>test.exe:Zone.Identifier"

这也适用于 PowerShell。

另一种选择是 Mark Russinovich 的streams实用程序,它允许您检查文件的 ADS 并删除它们。所以

streams -d myDownloadedFile.exe

也可以。

于 2009-10-24T10:18:23.933 回答
9

PoshCode 模块包括 Set-DownloadFlag 和 Remove-DownloadFlag 函数,它们的工作方式与宣传的一样。( _ _ http://poshcode.org/720

于 2009-10-29T06:43:05.573 回答
5

Oneliner 为所有孩子(正确引用)删除区域信息(受接受的答案启发)。

get-childitem -rec | % { cmd /c "echo.>""$($_.FullName)"":Zone.Identifier" }

没有严格回答这个问题,只是想确保当我下次提出这个问题时已经有解决方案:)。

PS。适用于 PS 2.0

于 2014-04-23T09:09:28.993 回答
4

在这样的论坛上发帖的新手,这可能是一个老话题,但这就是您要寻找的。

get-item -Path "path to file(s)" -Stream "Zone.Identifier" -ErrorAction "SilentlyContinue"

这应该列出仅被阻止的文件。

Unblock-File -Path "Path to blocked file(s)"

这将取消阻止它们。

于 2015-12-23T14:42:51.970 回答
2

要取消阻止文件夹及其子文件夹递归 (>= PowerShell v3),您可以使用Get-ChildItem (gci) 命令

Get-ChildItem "C:\Temp\" -recurse | Unblock-File

C:\Temp起始文件夹在哪里。

于 2018-12-06T13:35:09.393 回答
1

使用Streams.exe删除备用文件流, 请参阅此帖子: http: //www.paraesthesia.com/archive/2010/05/19/unblocking-multiple-files-at-once.aspx

于 2011-01-17T12:37:50.387 回答
1

我写了一个小函数,它使用 Win32 API 来删除Zone.IdentifierNTFS 备用数据流,这是 Windows 用来确定是否要阻止文件的。

.NET 无法访问备用数据流,因此该函数使用称为平台调用的技术来调用本机 Win32 API。与 PowerShell 的其他一些解决方案相比,它的好处是它支持 PowerShell 管道,因此您可以通过管道将文件路径或System.IO.FileInfo对象列表传递给函数。该函数也没有任何外部依赖项,实际上删除了备用数据流,而不是仅仅删除它的内容。

http://andyarismendi.blogspot.com/2012/02/unblocking-files-with-powershell.html

于 2012-02-25T19:35:41.093 回答
0

$_.FullName我将不得不修改@Mike 的答案:如果有空格(例如在“C:\ Program Files”中),这将不起作用,所以它必须是:

get-childitem -rec | % { cmd /c "echo.>""$($_.FullName)"":Zone.Identifier" }
于 2017-01-06T16:07:21.663 回答
0

我还没有看到任何似乎使用正确的 powershell cmdlet 来执行此操作的答案。

在这里,我们可以在当前文件夹中找到包含 zone.identifier 的 DLL:

Get-Item -Path .\*.dll -stream * | where {$_.Stream -eq "Zone.Identifier" }

在这里,我们只删除不需要的流,不像上面的一些答案可能会损坏其他流:

Remove-Item  -Path .\*.dll -stream Zone.Identifier
于 2017-03-10T19:11:23.283 回答
0

如果您使用的是 PowerShell 3.0 或更高版本,则 Unblock-file PowerShell cmdlet 应该通过取消阻止文件来解决此问题,即使文件属性窗口上没有取消阻止按钮也是如此。

Unblock-File cmdlet 允许您打开从 Internet 下载的文件。它会取消阻止从 Internet 下载的 Windows PowerShell 脚本文件,以便您可以运行它们,即使 Windows PowerShell 执行策略是 RemoteSigned 也是如此。默认情况下,这些文件被阻止以保护计算机免受不受信任的文件的侵害。

只需打开 powerShell 窗口并遵循以下语法。要查找有关语法的更多信息,请转到此处

例子 :

unblock-file -path C:\Downloads\MyFileName.chm

使用 PowerShell 屏幕截图取消阻止文件

警告:不要解锁不安全的文件。

于 2017-03-24T16:19:12.917 回答
0

如果您的服务器没有 Powershell > v3 ($PSVersionTable.PSVersion.Major -ge 3)。然后使用良好的旧可靠 DOS:

for /f "tokens=*" %f in ('dir /b *.*') do echo.>"%f":Zone.Identifier 
于 2017-07-19T09:18:12.547 回答
0

您可以像这样搜索被阻止的文件:

get-item * -stream zone*

然后解除阻塞文件,通过管道将其传递给 remove-item 或 "rm" 以删除 zone.identifier 流:

get-item * -stream zone* | Remove-Item

如果您想要递归搜索:

get-childitem -recurse | get-item -stream zone*
于 2019-09-13T21:46:16.110 回答
-1

你是这个意思吗:

set-executionpolicy remotesigned

这将允许您在没有签名的情况下执行本地脚本,如果已签名,则可以执行远程脚本。更多信息在这里

于 2009-10-24T09:48:36.857 回答