使用PowerShell取消阻止文件?

时间:2009-10-24 09:44:10

标签: powershell powershell-v2.0

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

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

13 个答案:

答案 0 :(得分: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相同,但在该资源管理器中工作不会再抱怨了。

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

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

这也适用于PowerShell。

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

streams -d myDownloadedFile.exe

也可以。

答案 1 :(得分:9)

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

答案 2 :(得分:5)

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

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

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

PS。适用于PS 2.0

答案 3 :(得分:3)

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

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

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

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

这将取消阻止它们。

答案 4 :(得分:1)

使用 Streams.exe 删除备用文件流 看这篇文章:http://www.paraesthesia.com/archive/2010/05/19/unblocking-multiple-files-at-once.aspx

答案 5 :(得分: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

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

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

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

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

Remove-Item  -Path .\*.dll -stream Zone.Identifier

答案 9 :(得分:0)

如果您使用的是PowerShell 3.0或更高版本, 取消阻止文件 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

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

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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

get-item * -stream zone*

然后取消阻止文件,通过管道删除项目或通过“ rm”删除zone.identifier流:

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

如果您要进行递归搜索:

get-childitem -recurse | get-item -stream zone*

答案 12 :(得分:-2)

你的意思是:

set-executionpolicy remotesigned

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