Разблокировать файл с помощью PowerShell? - PullRequest
31 голосов
/ 24 октября 2009

Я пытаюсь, чтобы PowerShell разблокировал файл в Win2K8 R2.

У кого-нибудь есть указатель на синтаксис?

Ответы [ 12 ]

47 голосов
/ 24 октября 2009

Если вы используете PowerShell v3, вы можете использовать командлет Unblock-File.


«Блокирующая» часть - это просто альтернативный поток данных файла с именем «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 больше не жалуется.

Кажется, что нет встроенной поддержки для обработки ADS из PowerShell (как упоминалось в блоге парня PowerShell здесь . В этой статье также есть некоторая информация о том, как получить эту функциональность в PowerShell). Вы можете, однако, просто вызвать cmd:

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

Это работает и в PowerShell.

Другой вариант - утилита Марка Руссиновича streams, которая позволяет вам проверять ADS файла, а также удалять их. Так

streams -d myDownloadedFile.exe

тоже работает.

9 голосов
/ 29 октября 2009

Модуль PoshCode включает функции Set-DownloadFlag и Remove-DownloadFlag, которые работают так, как объявлено. :) Я только что вытащил этот кусочек в свой собственный скрипт http://poshcode.org/1430 ... он будет работать и в PowerShell 1, если вы используете функцию New-Type вместо Add-Type ( http://poshcode.org/720)

5 голосов
/ 23 апреля 2014

Oneliner для удаления зоны информации (на основе принятого ответа) для всех детей (с правильным цитированием).

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

Не совсем ответ на вопрос, просто хочу убедиться, что когда я в следующий раз придумаю эту проблему, уже есть решение :))

PS. Работает в PS 2.0

3 голосов
/ 23 декабря 2015

плохо знакомы с публикацией на подобных форумах, и это может быть старая тема, но вот то, что вы ищете.

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

В этом списке должны быть перечислены только заблокированные файлы.

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

Это разблокирует их.

1 голос
/ 06 декабря 2018

Чтобы разблокировать папку и ее подпапку рекурсивно (> = PowerShell v3), вы можете использовать команду Get-ChildItem (gci) :

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

где C:\Temp - начальная папка.

1 голос
/ 25 февраля 2012

Я написал небольшую функцию, которая использует Win32 API для удаления альтернативного потока данных Zone.Identifier NTFS, который Windows использует для определения необходимости блокировки файла.

.NET не имеет доступа к альтернативным потокам данных, поэтому функция использует технику, называемую платформой, для вызова собственного API-интерфейса Win32. Преимущество этого по сравнению с некоторыми другими решениями для PowerShell заключается в том, что он поддерживает конвейер PowerShell, поэтому вы можете направить список путей к файлам или System.IO.FileInfo объектам в функцию. Функция также не имеет внешних зависимостей и фактически удаляет альтернативный поток данных, а не просто удаляет его содержимое.

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

1 голос
/ 17 января 2011

Удалите поток альтернативного файла, используя Streams.exe см. Этот пост: http://www.paraesthesia.com/archive/2010/05/19/unblocking-multiple-files-at-once.aspx

0 голосов
/ 19 июля 2017

Если на вашем сервере нет Powershell> v3 ($ PSVersionTable.PSVersion.Major -ge 3). Тогда используйте старый добрый надежный DOS:

for /f "tokens=*" %f in ('dir /b *.*') do echo.>"%f":Zone.Identifier 
0 голосов
/ 24 марта 2017

Если вы используете PowerShell 3.0 или выше, Unblock-file Командлет PowerShell должен решить эту проблему, разблокировав файл, даже если у вас нет кнопки разблокировки в окне свойств файла.

Командлет Unblock-File позволяет открывать файлы, которые были загружены из Интернета. Он разблокирует файлы сценариев Windows PowerShell, которые были загружены из Интернета, чтобы вы могли запускать их, даже если для политики выполнения Windows PowerShell задано значение RemoteSigned. По умолчанию эти файлы блокируются для защиты компьютера от ненадежных файлов.

Просто откройте окно PowerShell и следуйте синтаксису ниже. Чтобы найти больше информации о синтаксисе, перейдите на здесь

Пример:

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

Разблокировать файл с помощью снимка экрана PowerShell

Предупреждение. Не разблокируйте незащищенные файлы.

0 голосов
/ 10 марта 2017

Я еще не видел ответа, который, кажется, использует для этого соответствующие командлеты powershell.

Здесь мы можем найти библиотеки DLL в текущей папке, которые содержат zone.identifier:

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

Здесь мы убираем только нежелательные потоки, в отличие от некоторых ответов выше, которые могут повредить другие потоки:

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