Политика исполнения Powershell противоречит подписи?

Пожалуйста, посмотрите на следующий URL: URL

Теперь сказано следующее о загруженных скриптах:

"Запускает сценарии, которые загружены из Интернета и не подписаны, если сценарии разблокированы, например, с помощью командлета Unblock-File".

Я только что загрузил скрипт из галереи technet (PS2EXE) и смог запустить тестовый скрипт, который был включен просто отлично, без использования командлета Unblock_file. Что здесь происходит? Я неправильно понимаю, что Microsoft говорит мне, или это глюк?

1 ответ

Решение

help unblock-file:

Внутренне командлет Unblock-File удаляет альтернативный поток данных Zone.Identifier, который имеет значение "3", указывающее, что он был загружен из Интернета.

Идея файла, являющегося "удаленным" или "поступающим из Интернета", - это данные о вашей локальной компьютерной файловой системе, которые должны быть помещены туда инструментом, который загружает файл, он не включается в файл во время загрузки.

Если вы загрузили файл через Internet Explorer, возможно, FireFox, Invoke-WebRequest, они добавят его. Если вы загружаете что-то еще, инструмент может не добавить этот альтернативный поток.

Посмотрите, как это ведет себя:

# Show folder is empty
PS C:\temp\> Get-ChildItem


# Make a test script which prints Hello World, and run it
PS C:\temp\> "'Hello World'" | Set-Content -Path .\test.ps1
PS C:\temp\> .\test.ps1
Hello World


# Show the file exists
PS C:\temp\> Get-ChildItem

    Directory: C:\temp\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       01/08/2018     22:07             15 test.ps1


# Add the Zone Identifier alternate data stream
PS C:\temp\> "[ZoneTransfer]`nZoneId=3" | Set-Content -Path 'test.ps1' -Stream 'Zone.Identifier'


# Show that it doesn't appear in a normal directory listing:
PS C:\temp\> Get-ChildItem

    Directory: C:\temp\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       01/08/2018     22:08             15 test.ps1



# Show how it blocks the file from running
PS C:\temp\> .\test.ps1
.\test.ps1 : File C:\temp\test.ps1 cannot be loaded. The file C:\temp\test.ps1 is not digitally signed. You cannot
run this script on the current system. For more information about running scripts and setting execution policy, see
about_Execution_Policies at http://go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ .\test.ps1
+ ~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess


# Show file content
PS C:\temp\> Get-Content -Path .\test.ps1
'Hello World'


# Show alternate data stream content
PS C:\temp\> Get-Content -Path .\test.ps1 -Stream 'Zone.Identifier'
[ZoneTransfer]
ZoneId=3


# Unblock-File removes this alternate stream
PS C:\temp\> Unblock-File .\test.ps1


# Script runs again
PS C:\temp\> .\test.ps1
Hello World

Таким образом, главный вопрос, если вы запускаете Get-Content file.ps1:Zone.Identifier и увидеть ZoneId 3 и все еще может запустить скрипт, и Get-ExecutionPolicy RemoteSigned, тогда у вас происходит что-то странное.

Но я предполагаю, что инструмент загрузки не добавил эти данные, поэтому файл выглядит как локально созданный.

NB. RemoteSigned не предназначен для обеспечения безопасности, он предназначен для "защиты от случайного запуска сценариев перед их чтением и преднамеренного выбора их запуска", проверьте, как "вы уверены?" окно, а не как запрос пароля.

Другие вопросы по тегам