Ошибка выполнения скрипта PowerShell: “выполнение скриптов отключено в этой системе”
Я столкнулся с ошибкой при попытке запустить скрипт PowerShell из cmd.exe на Windows Server 2008 R2. Несмотря на установку политики выполнения на Неограниченный в PowerShell, я все равно получаю следующую ошибку:
Файл Management_Install.ps1 не может быть загружен, так как выполнение скриптов отключено в этой системе.
Вот что я уже пробовал:
- Установил политику выполнения на Неограниченный:
Set-ExecutionPolicy -ExecutionPolicy Unrestricted - Проверил, что политика установлена правильно:Вывод: Unrestricted
Get-ExecutionPolicy
Однако при запуске скрипта из cmd.exe:
cd "C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts"
powershell .\Management_Install.ps1 1
Я получаю эту ошибку:
ПРЕДУПРЕЖДЕНИЕ: Запускается x86 PowerShell…
Файл C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\Management_Install.ps1 не может быть загружен, так как выполнение скриптов отключено в этой системе. Для получения дополнительной информации см. “get-help about_signing”.
В строке:1 знак:25
.\Management_Install.ps1 1
CategoryInfo : NotSpecified: (:) [], PSSecurityException
FullyQualifiedErrorId : RuntimeException
Что я делаю неправильно с настройками политики выполнения PowerShell?
Содержание
- Понимание проблемы архитектуры
- Проверка политик выполнения для обеих архитектур
- Решение: Запуск 64-битного PowerShell из cmd.exe
- Альтернатива: Установка политики выполнения для обеих архитектур
- Дополнительные шаги по устранению неполадок
- Лучшие практики выполнения скриптов PowerShell
Понимание проблемы архитектуры
На 64-битных системах Windows существуют две отдельные версии PowerShell:
- 64-битный PowerShell:
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe - 32-битный PowerShell:
%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
При запуске powershell.exe из cmd.exe без указания архитектуры по умолчанию запускается 32-битная версия (x86) из-за поведения перенаправителя файловой системы Windows. Сообщение предупреждения “ПРЕДУПРЕЖДЕНИЕ: Запуск x86 PowerShell…” подтверждает, что именно это происходит в вашем случае.
Каждая версия независимо поддерживает свою собственную политику выполнения, поэтому установка ее в одной версии не влияет на другую.
Проверка политик выполнения для обеих архитектур
Чтобы убедиться в этом, проверьте политику выполнения для обеих архитектур:
# Для 32-битного PowerShell (то, что по умолчанию запускается из cmd.exe)
%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -Command "Get-ExecutionPolicy"
# Для 64-битного PowerShell (то, что вы, вероятно, настроили)
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -Command "Get-ExecutionPolicy"
Скорее всего, вы увидите, что 32-битная версия все еще имеет ограничительную политику, такую как Restricted или RemoteSigned, в то время как 64-битная версия показывает Unrestricted.
Решение: Запуск 64-битного PowerShell из cmd.exe
Самый быстрый способ исправить проблему — явно запустить 64-битную версию PowerShell из cmd.exe:
cd "C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts"
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -File .\Management_Install.ps1 1
Альтернативно, вы можете использовать параметр -ExecutionPolicy для переопределения текущей политики:
powershell.exe -ExecutionPolicy Unrestricted -File .\Management_Install.ps1 1
Однако первый метод более надежен, так как он гарантирует использование правильной архитектуры.
Альтернатива: Установка политики выполнения для обеих архитектур
Если вы хотите, чтобы обе версии имели одинаковую политику, установите ее для обеих архитектур:
# Установка для 64-битного PowerShell
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -Command "Set-ExecutionPolicy Unrestricted -Force"
# Установка для 32-битного PowerShell
%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -Command "Set-ExecutionPolicy Unrestricted -Force"
Параметр -Force предотвращает запросы на подтверждение.
Дополнительные шаги по устранению неполадок
Если вышеуказанные решения не работают, рассмотрите эти дополнительные факторы:
1. Проблемы с контролем учетных записей (UAC)
В Windows Server 2008 R2 UAC может мешать выполнению скриптов. Попробуйте сначала запустить cmd.exe от имени администратора, а затем выполнить команду PowerShell.
2. Системная групповая политика
Проверьте, нет ли системной групповой политики, которая переопределяет ваше пользовательское значение:
- Откройте
gpedit.msc - Перейдите в
Конфигурация компьютера > Административные шаблоны > Компоненты Windows > Windows PowerShell - Убедитесь, что параметр “Включить выполнение скриптов” не установлен в “Отключено”
3. Требования к подписи скриптов
Даже с политикой Unrestricted, если скрипт требует подписи (что не должно быть при Unrestricted), вам может потребоваться обойти проверки подписи:
powershell.exe -ExecutionPolicy Bypass -File .\Management_Install.ps1 1
4. Проблемы содержимого скрипта
Убедитесь, что ваш скрипт не содержит синтаксических ошибок или командлетов, которые ограничены другими механизмами безопасности помимо политики выполнения.
Лучшие практики выполнения скриптов PowerShell
Чтобы избежать подобных проблем в будущем:
-
Всегда указывайте архитектуру PowerShell при запуске скриптов из cmd.exe:
cmd# Для 64-битных скриптов %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -File script.ps1 # Для 32-битных скриптов (редко) %SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -File script.ps1 -
Используйте параметр
-ExecutionPolicyпри запуске скриптов для обеспечения последовательного поведения:cmdpowershell.exe -ExecutionPolicy Unrestricted -File script.ps1
-
Устанавливайте политики выполнения последовательно для обеих архитектур при развертывании скриптов на нескольких системах.
-
Рассмотрите возможность использования PowerShell ISE или Visual Studio Code для разработки и тестирования скриптов, так как эти инструменты обеспечивают лучую обратную связь об ошибках.
-
Документируйте требования скриптов, включая требуемую версию PowerShell и политику выполнения, чтобы избежать проблем при развертывании.
Явно запуская 64-битную версию PowerShell из cmd.exe, вы должны успешно выполнить свой скрипт, несмотря на несоответствие политик выполнения между архитектурами.