如何成功更改执行策略并启用 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 搜索栏中搜索“组策略”来找到它。或者这样做:

  1. 点击 Win + r 并输入命令 mmc 打开管理控制台。
  2. 转到 File -> Add Remove Snap In...
  3. 在左窗格中找到 Group Policy Object Editor 并添加它。
  4. 关闭表单。

然后在左侧窗格中可以展开组编辑器。展开它并导航到 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,错误可能是由 CurrentUserProcess 范围中的设置引起的。但是,更常见的原因是脚本执行是通过组策略(本地或域)配置的。

本地组策略可以由本地管理员通过 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 在范围 MachinePolicyUserPolicy).

如果您最近 运行 使用 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

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

如果 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 命令起作用。