使用PowerShell取消阻止文件?

问题描述 投票:31回答:12

我想让PowerShell在Win2K8 R2中取消阻止文件。

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

powershell powershell-v2.0
12个回答
47
投票

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


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

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

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

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的博客here中所述。该文章还提供了一些如何在PowerShell中获取该功能的信息)。但是,你可以简单地调用cmd:

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

这也适用于PowerShell。

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

streams -d myDownloadedFile.exe

确实有效。


0
投票

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

for /f "tokens=*" %f in ('dir /b *.*') do echo.>"%f":Zone.Identifier 

0
投票

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

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

只需打开powerShell窗口并按照以下语法操作即可。要查找有关语法的更多信息,请访问here

示例:

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

Unblock file with PowerShell screen shot

警告:不要取消阻止不安全的文件。


-2
投票

你的意思是这样的:

set-executionpolicy remotesigned

这将允许您在不签名的情况下执行本地脚本,如果签名则执行远程脚本。更多信息here


9
投票

PoshCode模块包括Set-DownloadFlag和Remove-DownloadFlag功能,这些功能与宣传的一样。 :)我刚刚把这篇文章放到它自己的脚本贡献http://poshcode.org/1430中......如果你使用New-Type函数代替Add-Type(http://poshcode.org/720),它也适用于PowerShell 1


5
投票

一个班轮为所有孩子删除区域信息(灵感来自已接受的答案)(正确引用)。

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

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

PS。适用于PS 2.0


3
投票

在这样的论坛中发布的新内容,这可能是一个老话题,但这里是你正在寻找的。

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

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

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

这将取消阻止它们。


1
投票

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


1
投票

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

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

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


1
投票

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

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

其中C:\Temp是起始文件夹。


0
投票

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

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

0
投票

我还没有看到任何答案似乎使用适当的powershell cmdlet来做到这一点。

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

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

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

Remove-Item  -Path .\*.dll -stream Zone.Identifier
© www.soinside.com 2019 - 2024. All rights reserved.