Как успешно изменить политику выполнения и включить выполнение сценариев 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

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

6 ответов


сообщение об ошибке указывает, что параметр, который вы пытаетесь определить через 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) по-прежнему имеет приоритет, предотвращая или разрешая выполнение скрипта.

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

локальная групповая политика может быть изменена локальным администратором через 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.
  • включено: разрешить выполнение скриптов PowerShell.
    • разрешить только подписанные скрипты: разрешить выполнение только подписанных скриптов (так же, как Set-ExecutionPolicy AllSigned).
    • разрешить локальные скрипты и удаленные подписанные скрипты: разрешить выполнение всех локальных скриптов (подписанных или нет) и подписанных скриптов из удаленных мест (так же, как Set-ExecutionPolicy RemoteSigned).
    • разрешить все скрипты: разрешить выполнение локальных и удаленных скриптов независимо от того, подписаны они или нет (так же, как Set-ExecutionPolicy Unrestricted).
  • отключен: запретить выполнение сценария PowerShell (так же, как Set-ExecutionPolicy Restricted).

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


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

и по умолчанию политика выполнения сценария локальной группы является такой, для которой сценарии не разрешены к выполнению. Мы должны это изменить!

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

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

  1. Откройте консоль управления нажатием Win + r и введите команду mmc.
  2. на File -> Add Remove Snap In....
  3. в левой панели найдите Group Policy Object Editor и добавить его.
  4. закрыть форму.

затем на левой панели можно развернуть редактор групп. Разверните его и перейдите к 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 и закройте консоль управления.


исправление теперь доступно для установки:

2.8.7 для VS 2013: https://github.com/NuGet/Home/releases/download/2.8.7/NuGet.Tools.vsix

3.1.1 для VS 2015: https://github.com/NuGet/Home/releases/download/3.1.1/NuGet.Tools.vsix

https://github.com/NuGet/Home/issues/974


Если вы недавно столкнулись с этим в visual studio 2015, проверьте, есть ли какие-либо обновления для диспетчера пакетов nuget в tools > extensions and updates>


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

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

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

затем создать файл с именем %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Меню Пуск\Программы\запуск\запуск.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

этот скрипт будет работать в начале каждого входа в систему.


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

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

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

psa mypowershell.ps1