Как вы успешно изменяете политику выполнения и разрешаете выполнение сценариев PowerShell

У меня проблема с изменением политики выполнения в моей ОС Windows Server 2008+. Это первый раз, когда я пытаюсь запустить скрипт, для которого мне нужен полный доступ к ресурсам, и я пытаюсь сделать следующее после запуска Powershell в режиме с повышенными правами:

Set-ExecutionPolicy Unrestricted

Но я получаю это:

Set-ExecutionPolicy : Windows PowerShell updated your execution policy
successfully, but the setting is overridden by a policy defined at a more
specific scope.  Due to the override, your shell will retain its current
effective execution policy of RemoteSigned. Type "Get-ExecutionPolicy -List"
to view your execution policy settings. For more information please see
"Get-Help Set-ExecutionPolicy".
At line:1 char:1
+ Set-ExecutionPolicy Unrestricted
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (:) [Set-ExecutionPolicy], SecurityException
    + FullyQualifiedErrorId : ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand

Хотя я и являюсь администратором, я не могу изменить политику выполнения. Что делать?

Ответы

Ответ 1

Сообщение об ошибке указывает, что параметр, который вы пытаетесь определить через Set-ExecutionPolicy, переопределяется параметром в другой области. Используйте Get-ExecutionPolicy -List, чтобы узнать, какая область имеет эту настройку.

PS C:\> Get-ExecutionPolicy -List

        Scope    ExecutionPolicy
        -----    ---------------
MachinePolicy          Undefined
   UserPolicy          Undefined
      Process          Undefined
  CurrentUser          Undefined
 LocalMachine       RemoteSigned

PS C:\> Set-ExecutionPolicy Restricted -Scope Process -Force
PS C:\> Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force
Set-ExecutionPolicy : Windows PowerShell updated your execution policy
successfully, but the setting is overridden by a policy defined at a more
specific scope.  Due to the override, your shell will retain its current
effective execution policy of Restricted. Type "Get-ExecutionPolicy -List"
to view your execution policy settings. ...
PS C:\> Get-ExecutionPolicy -List

        Scope    ExecutionPolicy
        -----    ---------------
MachinePolicy          Undefined
   UserPolicy          Undefined
      Process         Restricted
  CurrentUser       Unrestricted
 LocalMachine       RemoteSigned

PS C:\> .\test.ps1
.\test.ps1 : File C:\test.ps1 cannot be loaded because running scripts is
disabled on this system. ...
PS C:\> Set-ExecutionPolicy Unestricted -Scope Process -Force
PS C:\> Set-ExecutionPolicy Restricted -Scope CurrentUser -Force
Set-ExecutionPolicy : Windows PowerShell updated your execution policy
successfully, but the setting is overridden by a policy defined at a more
specific scope.  Due to the override, your shell will retain its current
effective execution policy of Restricted. Type "Get-ExecutionPolicy -List"
to view your execution policy settings. ...
PS C:\> Get-ExecutionPolicy -List

        Scope    ExecutionPolicy
        -----    ---------------
MachinePolicy          Undefined
   UserPolicy          Undefined
      Process       Unrestricted
  CurrentUser         Restricted
 LocalMachine       RemoteSigned

PS C:\> .\test.ps1
Hello World!

Как вы можете видеть, обе настройки были определены, несмотря на ошибку, но параметр в более конкретной области (Process) по-прежнему имеет приоритет, предотвращая или разрешая выполнение script.

Поскольку область по умолчанию LocalMachine, ошибка может быть вызвана настройкой в ​​области CurrentUser или Process. Однако более распространенная причина заключается в том, что выполнение script было выполнено с помощью групповой политики (локальной или доменной).

Локальная групповая политика может быть изменена локальным администратором через gpedit.msc (редактор локальной групповой политики), как описано в этом ответе.

Политика группы домена не может быть заменена локальными настройками/политиками и должна быть изменена администратором домена через gpmc.msc (Управление групповыми политиками) на контроллере домена.

Для политики как локального, так и для домена эта настройка может быть определена как настройка компьютера:

Computer Configuration
`-Administrative Templates
  `-Windows Components
    `-Windows PowerShell -> Turn on Script Execution

или как пользовательская настройка:

User Configuration
`-Administrative Templates
  `-Windows Components
    `-Windows PowerShell -> Turn on Script Execution

Первые применяются к компьютерным объектам, тогда как последние применяются к объектам пользователя. Для локальной политики нет существенной разницы между пользовательскими и компьютерными политиками, поскольку политики пользователей автоматически применяются ко всем пользователям на компьютере.

В политике может быть одно из трех состояний (или пять состояний, если вы подсчитаете 3 параметра, доступные для состояния, включенного отдельно):

  • Не настроено: политика не контролирует выполнение PowerShell script.
  • Включено: разрешить выполнение PowerShell script.
    • Разрешить только подписанные скрипты: разрешить выполнение только подписанных скриптов (так же, как Set-ExecutionPolicy AllSigned).
    • Разрешить локальные скрипты и удаленные подписанные скрипты: разрешить выполнение всех локальных скриптов (подписанных или нет) и подписанных скриптов из удаленных мест (так же, как Set-ExecutionPolicy RemoteSigned).
    • Разрешить все сценарии: разрешить выполнение локальных и удаленных скриптов независимо от того, подписаны они или нет (такие же, как Set-ExecutionPolicy Unrestricted).
  • Отключено: запретить выполнение PowerShell script (то же, что и Set-ExecutionPolicy Restricted).

Изменения, сделанные с помощью Set-ExecutionPolicy, становятся эффективными только тогда, когда для локальных политик и политик домена установлено значение Не настроено (политика выполнения Undefined в областях MachinePolicy и UserPolicy).

Ответ 2

Проблема заключается в том, что Windows не разрешает выполнение всех сценариев в режиме Unrestricted. На самом деле, независимо от политики выполнения для вашего пользователя (даже если администратор), приоритет будет Local Group Policy.

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

Изменение политики выполнения локальных групп

Мы делаем это через Local Group Policy Editor, который вы можете найти, выполнив поиск на панели поиска Windows для "групповой политики". Или выполните следующее:

  • Откройте консоль управления, нажав Win + r и введите команду mmc.
  • Перейдите к File -> Add Remove Snap In....
  • На левой панели найдите Group Policy Object Editor и добавьте его.
  • Закройте форму.

Затем на левой панели редактор группы может быть расширен. Разверните его и перейдите к Computer Configuration -> Administrative Templates -> Windows Components.

enter image description here

Затем до Windows PowerShell.

enter image description here

Итак, выберите Turn on Script Execution. Измените конфигурацию на Enabled и укажите Allow all scripts в Execution Policy.

enter image description here

Подтвердите, нажав Ok и закройте консоль управления.

Ответ 4

Если вы недавно используете Visual Studio 2015, проверьте, есть ли какие-либо обновления для менеджера пакетов nuget в инструментах > расширениях и обновлениях >

Ответ 5

Если PowerShell ExecutionPolicy устанавливается контроллером домена через групповую политику, вам придется reset ExecutionPolicy на "обход" в реестре после каждой загрузки. Я создал пару сценариев запуска для автоматизации процесса. Ниже я описываю свой процесс.

Создайте папку с именем% USERPROFILE%\Documents\StartupScripts, а затем поместите в нее PowerShell script с именем ExecutionPolicy.ps1 со следующим кодом:

Push-Location
Set-Location HKLM:\Software\Policies\Microsoft\Windows\PowerShell
Set-ItemProperty . ExecutionPolicy "Bypass"
Pop-Location

Затем создайте файл с именем% USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\Startup.cmd и поместите в него следующий код:

PowerShell -Version 3.0 -Command "Set-ExecutionPolicy Unrestricted" >> "%TEMP%\StartupLog.txt" 2>&1
PowerShell -Version 3.0 "%USERPROFILE%\Documents\StartupScripts\ExecutionPolicy.ps1" >> "%TEMP%\StartupLog.txt" 2>&1

Этот script будет запускаться в начале каждого входа.

Ответ 6

Создайте следующий ps.cmd и поместите его в свой PATH:

POWERSHELL -Command "$enccmd=[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content '%1' | Out-String)));POWERSHELL -EncodedCommand $enccmd"

Теперь вы можете запускать любую powershell script, как в:

psa mypowershell.ps1

Ответ 7

Даже если @Ansgar Wiechers Answer не работает.. Тогда у вас может быть проблема с MachinePolicy Scope. Таким образом, для этой проблемы может быть один способ. Отредактируйте значение реестра для ключа ExecutionPolicy по адресу

HKEY_LOCAL_MACHINE → ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ → Политики → Microsoft → Windows → Powershell

у меня получилось выполнить скрипт ps после того, как я попробовал так много решений.