首页 文章

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

提问于
浏览
27

我在更改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 回答

  • 11

    创建以下 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
    
  • 23

    错误消息表示您尝试通过 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 相同) .

    仅当本地和域策略设置为“未配置”(范围 MachinePolicyUserPolicy 中的执行策略 Undefined )时,通过 Set-ExecutionPolicy 所做的更改才会生效 .

  • 28

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

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

    更改本地组执行策略

    我们通过 Local Group Policy Editor 执行此操作,您可以通过在Windows搜索栏中搜索"group policy"来访问 . 或者这样做:

    • 点击 Win + r 并输入命令 mmc 打开管理控制台 .

    • 转到 File -> Add Remove Snap In... .

    • 在左侧窗格中找到 Group Policy Object Editor 并添加它 .

    • 关闭表格 .

    然后在左窗格中可以展开组编辑器 . 展开它并导航到 Computer Configuration -> Administrative Templates -> Windows Components .

    enter image description here

    然后到 Windows PowerShell .

    enter image description here

    所以选择 Turn on Script Execution . 将配置更改为 Enabled 并在 Execution Policy 中指定 Allow all scripts .

    enter image description here

    点击 Ok 确认并关闭管理控制台 .

  • 0

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

  • 4

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

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

相关问题