Как успешно изменить политику выполнения и включить выполнение сценариев 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 для "групповой политики". Или сделайте так:
- Откройте консоль управления нажатием
Win + r
и введите командуmmc
. - на
File -> Add Remove Snap In...
. - в левой панели найдите
Group Policy Object Editor
и добавить его. - закрыть форму.
затем на левой панели можно развернуть редактор групп. Разверните его и перейдите к Computer Configuration -> Administrative Templates -> Windows Components
.
затем Windows PowerShell
.
выберите Turn on Script Execution
. Измените конфигурацию на Enabled
и указать Allow all scripts
на Execution Policy
.
подтвердите нажатием 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
Если вы недавно столкнулись с этим в 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