НейроАгент

Ошибка выполнения скриптов PowerShell: Полное руководство по исправлению

Исправление ошибок выполнения скриптов PowerShell, вызванных несоответствиями политик 32-бит/64-бит. Полное руководство по устранению ошибок 'выполнение скриптов отключено' на Windows Server. Узнайте правильные решения прямо сейчас.

Вопрос

Ошибка выполнения скрипта PowerShell: “выполнение скриптов отключено в этой системе”

Я столкнулся с ошибкой при попытке запустить скрипт PowerShell из cmd.exe на Windows Server 2008 R2. Несмотря на установку политики выполнения на Неограниченный в PowerShell, я все равно получаю следующую ошибку:

Файл Management_Install.ps1 не может быть загружен, так как выполнение скриптов отключено в этой системе.

Вот что я уже пробовал:

  1. Установил политику выполнения на Неограниченный:
    Set-ExecutionPolicy -ExecutionPolicy Unrestricted
    
  2. Проверил, что политика установлена правильно:
    Get-ExecutionPolicy
    
    Вывод: Unrestricted

Однако при запуске скрипта из 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-битных системах 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…” подтверждает, что именно это происходит в вашем случае.

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

Проверка политик выполнения для обеих архитектур

Чтобы убедиться в этом, проверьте политику выполнения для обеих архитектур:

cmd
# Для 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:

cmd
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 для переопределения текущей политики:

cmd
powershell.exe -ExecutionPolicy Unrestricted -File .\Management_Install.ps1 1

Однако первый метод более надежен, так как он гарантирует использование правильной архитектуры.

Альтернатива: Установка политики выполнения для обеих архитектур

Если вы хотите, чтобы обе версии имели одинаковую политику, установите ее для обеих архитектур:

cmd
# Установка для 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), вам может потребоваться обойти проверки подписи:

cmd
powershell.exe -ExecutionPolicy Bypass -File .\Management_Install.ps1 1

4. Проблемы содержимого скрипта

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

Лучшие практики выполнения скриптов PowerShell

Чтобы избежать подобных проблем в будущем:

  1. Всегда указывайте архитектуру 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
    
  2. Используйте параметр -ExecutionPolicy при запуске скриптов для обеспечения последовательного поведения:

    cmd
    powershell.exe -ExecutionPolicy Unrestricted -File script.ps1
    
  3. Устанавливайте политики выполнения последовательно для обеих архитектур при развертывании скриптов на нескольких системах.

  4. Рассмотрите возможность использования PowerShell ISE или Visual Studio Code для разработки и тестирования скриптов, так как эти инструменты обеспечивают лучую обратную связь об ошибках.

  5. Документируйте требования скриптов, включая требуемую версию PowerShell и политику выполнения, чтобы избежать проблем при развертывании.


Явно запуская 64-битную версию PowerShell из cmd.exe, вы должны успешно выполнить свой скрипт, несмотря на несоответствие политик выполнения между архитектурами.