如何成功更改执行策略并启用 PowerShell 脚本的执行
How do you successfully change execution policy and enable execution of PowerShell scripts
我在 Windows Server 2008+ OS 中更改 执行策略 时遇到问题。这是我第一次尝试运行需要资源完全访问权限的脚本,在 提升模式 中启动 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
虽然我是管理员,但我无法更改执行策略。该怎么办?
问题是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
.
所以selectTurn on Script Execution
。将配置更改为 Enabled
并在 Execution Policy
.
中指定 Allow all scripts
点击 Ok
确认并关闭管理控制台。
该错误消息表明您尝试通过 Set-ExecutionPolicy
定义的设置已被另一个范围内的设置覆盖。使用 Get-ExecutionPolicy -List
查看哪个范围具有哪个设置。
PS C:\> <b>Get-ExecutionPolicy -List</b>
范围执行政策
----- --------------
MachinePolicy 未定义
用户策略未定义
进程未定义
当前用户未定义
LocalMachine 远程签名
PS C:\> <b>Set-ExecutionPolicy Restricted -Scope Process -Force</b>
PS C:\> <b>Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force</b>
Set-ExecutionPolicy : <i>Windows PowerShell 更新了您的执行策略
成功,但该设置被定义在更多位置的策略覆盖
具体范围。由于覆盖,您的 shell 将保留其当前
Restricted 的有效执行策略。输入 "Get-ExecutionPolicy -List"
查看您的执行策略设置。 ...</i>
PS C:\> <b>Get-ExecutionPolicy -List</b>
范围执行政策
----- --------------
MachinePolicy 未定义
用户策略未定义
<i>进程受限</i>
<i>当前用户不受限制</i>
LocalMachine 远程签名
PS C:\> <b>.\test.ps1</b>
.\test.ps1 : <i>File C:\test.ps1 无法加载,因为 运行 脚本是
在此系统上禁用。 ...</i>
PS C:\> <b>Set-ExecutionPolicy Unestricted -Scope Process -Force</b>
PS C:\> <b>Set-ExecutionPolicy Restricted -Scope CurrentUser -Force</b>
Set-ExecutionPolicy : <i>Windows PowerShell 更新了您的执行策略
成功,但该设置被定义在更多位置的策略覆盖
具体范围。由于覆盖,您的 shell 将保留其当前
Restricted 的有效执行策略。输入 "Get-ExecutionPolicy -List"
查看您的执行策略设置。 ...</i>
PS C:\> <b>Get-ExecutionPolicy -List</b>
范围执行政策
----- --------------
MachinePolicy 未定义
用户策略未定义
<i>处理不受限制</i>
<i>当前用户受限</i>
LocalMachine 远程签名
PS C:\> <b>.\test.ps1</b>
<i>你好世界!</i>
如您所见,尽管有错误,但两个设置都已定义,但更具体范围 (Process
) 中的设置仍然优先,阻止或允许脚本执行。
由于默认范围是 LocalMachine
,错误可能是由 CurrentUser
或 Process
范围中的设置引起的。但是,更常见的原因是脚本执行是通过组策略(本地或域)配置的。
本地组策略可以由本地管理员通过 gpedit.msc
(本地组策略编辑器)修改,如 中所述。
域组策略不能被本地 settings/policies 取代,必须由域管理员通过域控制器上的 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 脚本的执行。
- Enabled:允许执行 PowerShell 脚本。
- Allow only signed scripts:只允许执行已签名的脚本(与
Set-ExecutionPolicy AllSigned
相同)。
- 允许本地脚本和远程签名脚本:允许执行所有本地脚本(签名或未签名)和远程位置的签名脚本(与
Set-ExecutionPolicy RemoteSigned
相同) .
- 允许所有脚本:允许执行本地和远程脚本,无论它们是否已签名(与
Set-ExecutionPolicy Unrestricted
相同)。
- 已禁用:禁止执行 PowerShell 脚本(与
Set-ExecutionPolicy Restricted
相同)。
通过 Set-ExecutionPolicy
所做的更改仅在本地和域策略设置为 未配置 时生效(执行策略 Undefined
在范围 MachinePolicy
和 UserPolicy
).
如果您最近 运行 使用 visual studio 2015,请在工具 > 扩展和更新>
中检查是否有任何 nuget 包管理器的更新
现在可以安装修补程序:
VS 2013 的 2.8.7:
https://github.com/NuGet/Home/releases/download/2.8.7/NuGet.Tools.vsix
VS 2015 的 3.1.1:
https://github.com/NuGet/Home/releases/download/3.1.1/NuGet.Tools.vsix
如果 PowerShell ExecutionPolicy 是由域控制器通过组策略设置的,您必须在每次启动后在注册表中将 ExecutionPolicy 重置为 "Bypass"。我创建了一对启动脚本来自动执行该过程。下面,我描述一下我的过程。
创建一个名为 %USERPROFILE%\Documents\StartupScripts 的文件夹,然后将一个名为 ExecutionPolicy.ps1 的 PowerShell 脚本放入其中,代码如下:
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
此脚本将 运行 在每次登录开始时。
将以下内容添加到名为 psa.cmd
的文件中,并放入包含您的 PATH 的文件夹中:
POWERSHELL -Command "$enccmd=[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content '%1' | Out-String)));POWERSHELL -EncodedCommand $enccmd"
现在您可以 运行 任何 powershell 脚本,如:
psa script.ps1
即使@Ansgar Wiechers 的回答不起作用.. 那么您的 MachinePolicy Scope 可能存在问题。所以可以有一个解决该问题的方法是..
在
处编辑 ExecutionPolicy 项的注册表值
HKEY_LOCAL_MACHINE -> SOFTWARE -> Policies -> Microsoft -> Windows ->
Powershell
在尝试了这么多解决方案后,我执行 ps 脚本很有效。
上次我跳进这个问题时,下面的代码修复了它。不要忘记 运行 具有管理员权限的终端并在执行脚本之前重新运行它。
Set-ItemProperty -path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell" EnableScripts 1
我刚刚做了:
Set-ExecutionPolicy Unrestricted -Scope Process -Force
Set-ExecutionPolicy Unrestricted
成功了
Set "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell" EnableScripts
在 windows 8 中进行了大量搜索后对我有用。它会导致 npm 和 ng 命令起作用。
我在 Windows Server 2008+ OS 中更改 执行策略 时遇到问题。这是我第一次尝试运行需要资源完全访问权限的脚本,在 提升模式 中启动 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
虽然我是管理员,但我无法更改执行策略。该怎么办?
问题是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
.
所以selectTurn on Script Execution
。将配置更改为 Enabled
并在 Execution Policy
.
Allow all scripts
点击 Ok
确认并关闭管理控制台。
该错误消息表明您尝试通过 Set-ExecutionPolicy
定义的设置已被另一个范围内的设置覆盖。使用 Get-ExecutionPolicy -List
查看哪个范围具有哪个设置。
PS C:\> <b>Get-ExecutionPolicy -List</b>
范围执行政策
----- --------------
MachinePolicy 未定义
用户策略未定义
进程未定义
当前用户未定义
LocalMachine 远程签名
PS C:\> <b>Set-ExecutionPolicy Restricted -Scope Process -Force</b>
PS C:\> <b>Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force</b>
Set-ExecutionPolicy : <i>Windows PowerShell 更新了您的执行策略
成功,但该设置被定义在更多位置的策略覆盖
具体范围。由于覆盖,您的 shell 将保留其当前
Restricted 的有效执行策略。输入 "Get-ExecutionPolicy -List"
查看您的执行策略设置。 ...</i>
PS C:\> <b>Get-ExecutionPolicy -List</b>
范围执行政策
----- --------------
MachinePolicy 未定义
用户策略未定义
<i>进程受限</i>
<i>当前用户不受限制</i>
LocalMachine 远程签名
PS C:\> <b>.\test.ps1</b>
.\test.ps1 : <i>File C:\test.ps1 无法加载,因为 运行 脚本是
在此系统上禁用。 ...</i>
PS C:\> <b>Set-ExecutionPolicy Unestricted -Scope Process -Force</b>
PS C:\> <b>Set-ExecutionPolicy Restricted -Scope CurrentUser -Force</b>
Set-ExecutionPolicy : <i>Windows PowerShell 更新了您的执行策略
成功,但该设置被定义在更多位置的策略覆盖
具体范围。由于覆盖,您的 shell 将保留其当前
Restricted 的有效执行策略。输入 "Get-ExecutionPolicy -List"
查看您的执行策略设置。 ...</i>
PS C:\> <b>Get-ExecutionPolicy -List</b>
范围执行政策
----- --------------
MachinePolicy 未定义
用户策略未定义
<i>处理不受限制</i>
<i>当前用户受限</i>
LocalMachine 远程签名
PS C:\> <b>.\test.ps1</b>
<i>你好世界!</i>
如您所见,尽管有错误,但两个设置都已定义,但更具体范围 (Process
) 中的设置仍然优先,阻止或允许脚本执行。
由于默认范围是 LocalMachine
,错误可能是由 CurrentUser
或 Process
范围中的设置引起的。但是,更常见的原因是脚本执行是通过组策略(本地或域)配置的。
本地组策略可以由本地管理员通过 gpedit.msc
(本地组策略编辑器)修改,如
域组策略不能被本地 settings/policies 取代,必须由域管理员通过域控制器上的 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 脚本的执行。
- Enabled:允许执行 PowerShell 脚本。
- Allow only signed scripts:只允许执行已签名的脚本(与
Set-ExecutionPolicy AllSigned
相同)。 - 允许本地脚本和远程签名脚本:允许执行所有本地脚本(签名或未签名)和远程位置的签名脚本(与
Set-ExecutionPolicy RemoteSigned
相同) . - 允许所有脚本:允许执行本地和远程脚本,无论它们是否已签名(与
Set-ExecutionPolicy Unrestricted
相同)。
- Allow only signed scripts:只允许执行已签名的脚本(与
- 已禁用:禁止执行 PowerShell 脚本(与
Set-ExecutionPolicy Restricted
相同)。
通过 Set-ExecutionPolicy
所做的更改仅在本地和域策略设置为 未配置 时生效(执行策略 Undefined
在范围 MachinePolicy
和 UserPolicy
).
如果您最近 运行 使用 visual studio 2015,请在工具 > 扩展和更新>
中检查是否有任何 nuget 包管理器的更新现在可以安装修补程序:
VS 2013 的 2.8.7: https://github.com/NuGet/Home/releases/download/2.8.7/NuGet.Tools.vsix
VS 2015 的 3.1.1: https://github.com/NuGet/Home/releases/download/3.1.1/NuGet.Tools.vsix
如果 PowerShell ExecutionPolicy 是由域控制器通过组策略设置的,您必须在每次启动后在注册表中将 ExecutionPolicy 重置为 "Bypass"。我创建了一对启动脚本来自动执行该过程。下面,我描述一下我的过程。
创建一个名为 %USERPROFILE%\Documents\StartupScripts 的文件夹,然后将一个名为 ExecutionPolicy.ps1 的 PowerShell 脚本放入其中,代码如下:
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
此脚本将 运行 在每次登录开始时。
将以下内容添加到名为 psa.cmd
的文件中,并放入包含您的 PATH 的文件夹中:
POWERSHELL -Command "$enccmd=[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes((Get-Content '%1' | Out-String)));POWERSHELL -EncodedCommand $enccmd"
现在您可以 运行 任何 powershell 脚本,如:
psa script.ps1
即使@Ansgar Wiechers 的回答不起作用.. 那么您的 MachinePolicy Scope 可能存在问题。所以可以有一个解决该问题的方法是.. 在
处编辑 ExecutionPolicy 项的注册表值HKEY_LOCAL_MACHINE -> SOFTWARE -> Policies -> Microsoft -> Windows -> Powershell
在尝试了这么多解决方案后,我执行 ps 脚本很有效。
上次我跳进这个问题时,下面的代码修复了它。不要忘记 运行 具有管理员权限的终端并在执行脚本之前重新运行它。
Set-ItemProperty -path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell" EnableScripts 1
我刚刚做了:
Set-ExecutionPolicy Unrestricted -Scope Process -Force
Set-ExecutionPolicy Unrestricted
成功了
Set "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell" EnableScripts
在 windows 8 中进行了大量搜索后对我有用。它会导致 npm 和 ng 命令起作用。