如何成功更改执行策略并启用PowerShell脚本的执行

时间:2015-01-03 10:37:33

标签: windows 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

虽然我是管理员,但我无法更改执行政策。该怎么办?

8 个答案:

答案 0 :(得分:32)

错误消息表示您尝试通过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,因此错误可能是由CurrentUserProcess范围内的设置引起的。但是,更常见的原因是脚本执行是通过组策略(本地或域)配置的。

本地管理员可以通过gpedit.msc(本地组策略编辑器)修改本地组策略,如this answer中所述。

域组策略不能被本地设置/策略取代,必须由域管理员通过域控制器上的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所做的更改才会生效1}})。

答案 1 :(得分:31)

问题是Windows不允许在Unrestricted模式下执行所有脚本。实际上,无论您的用户的执行策略(即使是管理员),Local Group Policy都将优先考虑。

默认情况下,本地组脚本执行策略是不允许执行脚本的策略。我们需要改变它!

更改本地组执行策略

我们通过您在Windows搜索栏中搜索“组策略”可以访问的Local Group Policy Editor来执行此操作。或者这样做:

  1. 点击Win + r并输入命令mmc
  2. ,打开管理控制台
  3. 转到File -> Add Remove Snap In...
  4. 在左侧窗格中找到Group Policy Object Editor并添加。
  5. 关闭表单。
  6. 然后在左侧窗格中可以展开组编辑器。展开它并导航到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 :(得分:11)

答案 3 :(得分:8)

如果您最近使用visual studio 2015遇到此问题,请检查工具中的nuget包管理器是否有任何更新>扩展和更新>

答案 4 :(得分:5)

如果域控制器通过组策略设置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

此脚本将在每次登录开始时运行。

答案 5 :(得分:2)

创建以下ps.cmd并将其放入PATH:

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

现在您可以运行任何PowerShell脚本,如下所示:

psa mypowershell.ps1

答案 6 :(得分:1)

即使@Ansgar Wiechers的答案不起作用,也可能导致MachinePolicy Scope出现问题。因此,针对该问题可以有一种解决方法。 在以下位置编辑ExecutionPolicy项的注册表值:

  

HKEY_LOCAL_MACHINE->软件->策略->微软-> Windows->   Powershell

尝试了很多解决方案后,我对执行ps脚本很有效。

答案 7 :(得分:0)

上次我遇到这个问题时,下面的代码修复了它。不要忘记以管理员权限运行终端并在执行脚本之前重新运行它。

Set-ItemProperty -path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell" EnableScripts 1