Я пытаюсь разблокировать файл PowerShell в Win2K8 R2.
Есть ли указатель на синтаксис?
Я пытаюсь разблокировать файл PowerShell в Win2K8 R2.
Есть ли указатель на синтаксис?
Если вы используете 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 (как упоминается в блоге The PowerShell Guy здесь. В этой статье также есть информация о том, как получить эту функциональность в PowerShell). Вы могли бы просто вызвать cmd:
cmd /c "echo.>test.exe:Zone.Identifier"
Это работает и с PowerShell.
Другим вариантом может быть утилита streams
Mark Russinovich, которая позволяет вам проверять файл ADS, а также удалять их. Так
streams -d myDownloadedFile.exe
также работает.
Модуль PoshCode включает в себя функции Set-DownloadFlag и Remove-DownloadFlag, которые работают как рекламируемые.:) Я только что вытащил этот кусок из своего собственного вклада script http://poshcode.org/1430... он тоже будет работать на PowerShell 1, если вы используете функцию New-Type вместо Add-Type (http://poshcode.org/720)
Oneliner для удаления информации о зоне (вдохновленной принятым ответом) для всех детей (с правильным цитированием).
get-childitem -rec | % { cmd /c "echo.>""$($_.FullName)"":Zone.Identifier" }
Не строго ответьте на вопрос, просто хочу убедиться, что когда я придумаю эту проблему, есть решение уже:).
PS. Работает в PS 2.0
new для публикации на форумах, как это, и это может быть старая тема, но вот что вы ищете.
get-item -Path "path to file(s)" -Stream "Zone.Identifier" -ErrorAction "SilentlyContinue"
Это должно содержать список только заблокированных файлов.
Unblock-File -Path "Path to blocked file(s)"
Это разблокирует их.
Удалите альтернативный поток файлов, используя Streams.exe см. эту запись: http://www.paraesthesia.com/archive/2010/05/19/unblocking-multiple-files-at-once.aspx
Я написал небольшую функцию, которая использует 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
Мне нужно изменить ответ Майка: это не сработает, если в $_ есть пробелы. FullName (например, как в "C:\Program Files" ), поэтому он должен быть:
get-childitem -rec | % { cmd /c "echo.>""$($_.FullName)"":Zone.Identifier" }
Я еще не видел ответа, который, как представляется, использует соответствующие командлеты powershell для этого.
Здесь мы можем найти DLL файлы в текущей папке, содержащей zone.identifier:
Get-Item -Path .\*.dll -stream * | where {$_.Stream -eq "Zone.Identifier" }
Здесь мы ограничиваем только нежелательные потоки, в отличие от некоторых ответов выше, которые могут повредить другие потоки:
Remove-Item -Path .\*.dll -stream Zone.Identifier
Если вы используете PowerShell 3.0 или более позднюю версию, командлет PowerShell Unblock-file должен решить эту проблему при разблокировке файла, даже если у вас нет кнопки разблокирования в окне свойств файла.
Командлет Unblock-File позволяет открывать файлы, загруженные из Интернета. Он разблокирует файлы сценариев Windows PowerShell, загруженные из Интернета, поэтому вы можете запускать их, даже если политика выполнения Windows PowerShell - это RemoteSigned. По умолчанию эти файлы блокируются для защиты компьютера от ненадежных файлов.
Просто откройте окно powerShell и следуйте ниже синтаксису. Подробнее о синтаксисе см. Здесь.
Пример:
unblock-file -path C:\Downloads\MyFileName.chm
Разблокировать файл с помощью экрана PowerShell
Предупреждение. Не разблокируйте незащищенные файлы.
Если на сервере нет Powershell > v3 ($ PSVersionTable.PSVersion.Major -ge 3). Затем используйте хороший старый надежный DOS:
for /f "tokens=*" %f in ('dir /b *.*') do echo.>"%f":Zone.Identifier
Чтобы разблокировать папку и ее подпапку рекурсивно (> = PowerShell v3), вы можете использовать команду Get-ChildItem (gci):
gci "C:\Temp\" -recurse | Unblock-File
где C:\Temp
- начальная папка.
Вы имеете в виду это:
set-executionpolicy remotesigned
Это позволит вам выполнять локальные скрипты без их подписания и удаленные, если они будут подписаны. Дополнительная информация доступна здесь.