我正在尝试让 PowerShell 取消阻止 Win2K8 R2 中的文件。
有没有人有关于语法的指针?
如果您使用的是 PowerShell v3,则可以使用Unblock-File
cmdlet。
“阻塞”部分只是文件的备用数据流,名为“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
也可以。
PoshCode 模块包括 Set-DownloadFlag 和 Remove-DownloadFlag 函数,它们的工作方式与宣传的一样。( _ _ http://poshcode.org/720)
Oneliner 为所有孩子(正确引用)删除区域信息(受接受的答案启发)。
get-childitem -rec | % { cmd /c "echo.>""$($_.FullName)"":Zone.Identifier" }
没有严格回答这个问题,只是想确保当我下次提出这个问题时已经有解决方案:)。
PS。适用于 PS 2.0
在这样的论坛上发帖的新手,这可能是一个老话题,但这就是您要寻找的。
get-item -Path "path to file(s)" -Stream "Zone.Identifier" -ErrorAction "SilentlyContinue"
这应该列出仅被阻止的文件。
Unblock-File -Path "Path to blocked file(s)"
这将取消阻止它们。
要取消阻止文件夹及其子文件夹递归 (>= PowerShell v3),您可以使用Get-ChildItem (gci) 命令:
Get-ChildItem "C:\Temp\" -recurse | Unblock-File
C:\Temp
起始文件夹在哪里。
使用Streams.exe删除备用文件流, 请参阅此帖子: http: //www.paraesthesia.com/archive/2010/05/19/unblocking-multiple-files-at-once.aspx
我写了一个小函数,它使用 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
$_.FullName
我将不得不修改@Mike 的答案:如果有空格(例如在“C:\ Program Files”中),这将不起作用,所以它必须是:
get-childitem -rec | % { cmd /c "echo.>""$($_.FullName)"":Zone.Identifier" }
我还没有看到任何似乎使用正确的 powershell cmdlet 来执行此操作的答案。
在这里,我们可以在当前文件夹中找到包含 zone.identifier 的 DLL:
Get-Item -Path .\*.dll -stream * | where {$_.Stream -eq "Zone.Identifier" }
在这里,我们只删除不需要的流,不像上面的一些答案可能会损坏其他流:
Remove-Item -Path .\*.dll -stream Zone.Identifier
如果您使用的是 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 > v3 ($PSVersionTable.PSVersion.Major -ge 3)。然后使用良好的旧可靠 DOS:
for /f "tokens=*" %f in ('dir /b *.*') do echo.>"%f":Zone.Identifier
您可以像这样搜索被阻止的文件:
get-item * -stream zone*
然后解除阻塞文件,通过管道将其传递给 remove-item 或 "rm" 以删除 zone.identifier 流:
get-item * -stream zone* | Remove-Item
如果您想要递归搜索:
get-childitem -recurse | get-item -stream zone*