关于Windows Server 2008 r2:PowerShell说“在此系统上禁用了脚本的执行”。

PowerShell says “execution of scripts is disabled on this system.”

我正在尝试运行一个从cmd.exe调用PowerShell脚本的cmd文件,并收到以下错误:

Management_Install.ps1 cannot be loaded because the execution of scripts is disabled on this system.

我已经跑了

1
Set-ExecutionPolicy -ExecutionPolicy Unrestricted

当我从PowerShell运行Get-ExecutionPolicy时,我把Unrestricted取回来。

1
2
PS C:\Users\Administrator\> Get-ExecutionPolicy
Unrestricted
1
2
3
C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> powershell .\Management_Install.ps1 1

WARNING: Running x86 PowerShell...

File C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\Management_Install.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see"get-help about_signing" for more details.

At line:1 char:25

  • .\Management_Install.ps1 <<<< 1

    • CategoryInfo : NotSpecified: (:) [], PSSecurityException

    • FullyQualifiedErrorId : RuntimeException

1
2
3
C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> PAUSE

Press any key to continue . . .

系统是Windows Server 2008R2。

我做错什么了?


如果您使用的是Windows Server 2008 R2,则PowerShell的x64和x86版本都必须设置其执行策略。您在两台主机上都设置了执行策略吗?

作为管理员,您可以通过在PowerShell窗口中键入以下内容来设置执行策略:

1
Set-ExecutionPolicy RemoteSigned

有关详细信息,请参阅使用set-executionpolicy cmdlet。


运行PowerShell时,可以通过添加-ExecutionPolicy ByPass绕过此策略。

1
powershell -ExecutionPolicy ByPass -File script.ps1


我遇到了类似的问题,并注意到WindowsServer2012上的默认cmd运行的是x64。

对于Windows 7、Windows 8、Windows 10、Windows Server 2008 R2或Windows Server 2012,请以管理员身份运行以下命令:

x86(32位)
打开C:\Windows\SysWOW64\cmd.exe
运行命令powershell Set-ExecutionPolicy RemoteSigned

x64(64位)
打开C:\Windows\system32\cmd.exe
运行命令powershell Set-ExecutionPolicy RemoteSigned

您可以使用检查模式

  • 在命令:echo %PROCESSOR_ARCHITECTURE%
  • 在PowerShell中:[Environment]::Is64BitProcess

参考文献:
msdn-Windows PowerShell执行策略
Windows-32位vs 64位目录说明


大多数现有的答案解释了如何进行,但很少有人解释了原因。在你到处执行来自互联网上陌生人的代码之前,尤其是那些禁用安全措施的代码,你应该清楚你在做什么。下面是关于这个问题的更多细节。

从TechNet关于执行策略页面:

Windows PowerShell execution policies let you determine the conditions under which Windows PowerShell loads configuration files and runs scripts.

PowerShell基础-执行策略和代码签名列举的好处包括:

  • Control of Execution - Control the level of trust for executing scripts.
  • Command Highjack - Prevent injection of commands in my path.
  • Identity - Is the script created and signed by a developer I trust and/or a signed with a certificate from a Certificate Authority I trust.
  • Integrity - Scripts cannot be modified by malware or malicious user.

要检查当前的执行策略,可以运行Get-ExecutionPolicy。但你来这里可能是因为你想改变它。

为此,您将运行Set-ExecutionPolicycmdlet。

在更新执行策略时,您需要做两个主要的决定。

执行策略类型:

  • EDOCX1?2?-系统上不能执行本地、远程或下载的脚本。
  • AllSigned-运行的所有脚本都需要数字签名。
  • RemoteSigned—所有远程脚本(unc)或下载的脚本都需要签名。
  • Unrestricted—任何类型的脚本都不需要签名。

新变更范围

  • EDOCX1?6?-执行策略影响计算机的所有用户。
  • CurrentUser—执行策略只影响当前用户。
  • Process—执行策略仅影响当前的Windows PowerShell进程。

?=默认值

例如:如果您想将策略更改为仅对当前用户进行远程签名,则可以运行以下命令:

1
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

注意:为了更改执行策略,必须以管理员身份运行PowerShell。如果您处于常规模式并尝试更改执行策略,则会出现以下错误:

Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied. To change the execution policy for the default (LocalMachine) scope, start Windows PowerShell with the"Run as administrator" option.

如果要加强对尚未从Internet下载(或至少不包含UNC元数据)的脚本的内部限制,可以强制策略仅运行签名的SRIPT。要签署自己的脚本,可以按照Scott Hanselman关于签署PowerShell脚本的文章中的说明进行操作。

注意:大多数人在每次打开PowerShell时都可能会遇到此错误,因为ps在启动时要做的第一件事是执行用户配置文件脚本,该脚本可以根据您的喜好设置环境。

文件通常位于:

1
%UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1

通过运行powershell变量,可以找到确切的位置。

1
$profile

如果您不关心配置文件中的任何内容,也不想对您的安全设置大惊小怪,您只需删除它,PowerShell就不会找到它无法执行的任何内容。


在Windows 7中:

转到"开始"菜单并搜索"Windows PowerShell ISE"。

右键单击x86版本并选择"以管理员身份运行"。

在顶部,粘贴Set-ExecutionPolicy RemoteSigned;运行脚本。选择"是"。

对64位版本的PowerShellISE(非x86版本)也重复这些步骤。

我只是在澄清@chad miller暗示的步骤。谢谢乍得!


同时在脚本解决问题之前运行此命令:

1
set-executionpolicy unrestricted


如果您所处的环境不是管理员,则可以仅为您设置执行策略,而不需要管理员。

1
Set-ExecutionPolicy -Scope"CurrentUser" -ExecutionPolicy"RemoteSigned"

1
Set-ExecutionPolicy -Scope"CurrentUser" -ExecutionPolicy"Unrestricted"

您可以在帮助条目中阅读关于它的所有信息。

1
2
Help Get-ExecutionPolicy -Full
Help Set-ExecutionPolicy -Full


远程签名:您自己创建的所有脚本都将运行,从Internet下载的所有脚本都需要由受信任的发布者签名。

好的,只需键入以下内容即可更改策略:

1
Set-ExecutionPolicy RemoteSigned

我们可以通过下面的命令得到当前ExecutionPolicy的状态:

1
Get-ExecutionPolicy;

默认情况下,它是受限制的。要允许执行PowerShell脚本,我们需要将此ExecutionPolicy设置为Bypass或Unrestricted。

我们可以使用以下任何PowerShell命令将当前用户的策略设置为BypassUnrestricted

1
2
3
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force;

无限制策略加载所有配置文件并运行所有脚本。如果运行从Internet下载的未签名脚本,则会在运行该脚本之前提示您输入权限。

而在旁路策略中,没有阻塞任何内容,脚本执行期间也没有警告或提示。旁路ExecutionPolicyUnrestricted放松。


我正在使用Windows 10,无法运行任何命令。唯一给我一些线索的命令是:

[X64 ]

  • Open C:\Windows\SysWOW64\cmd.exe [as administrator]
  • Run the command> powershell Set-ExecutionPolicy Unrestricted
  • 但这不起作用。它是有限的。可能是Windows10的新安全策略。我犯了这个错误:

    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...

    所以我找到了另一种方法(解决方案):

  • 打开运行命令/控制台(winakbd+r)
  • 类型:gpedit.msc(组策略编辑器)
  • 浏览到本地计算机策略->计算机配置->管理模板->Windows组件->Windows PowerShell。
  • 启用"打开脚本执行"
  • 根据需要设置策略。我将我的设置为"允许所有脚本"。
  • 现在打开PowerShell并享受;)


    设置执行策略是环境特定的。如果试图从正在运行的x86 ISE执行脚本,则必须使用x86 PowerShell设置执行策略。同样,如果运行64位ISE,则必须使用64位PowerShell设置策略。


    winakbd+r,键入copy-paste命令,然后按ok

    1
    powershell Set-ExecutionPolicy -Scope"CurrentUser" -ExecutionPolicy"RemoteSigned"

    然后执行脚本。

    然后恢复如下更改:

    1
    powershell Set-ExecutionPolicy -Scope"CurrentUser" -ExecutionPolicy"AllSigned"

    您还可以使用以下命令绕过此操作:

    1
    PS > powershell Get-Content .\test.ps1 | Invoke-Expression

    您还可以阅读Scott Sutherland的这篇文章,其中解释了15种不同的绕过PowerShell Set-ExecutionPolicy的方法,如果您没有管理员权限:

    绕过PowerShell执行策略的15种方法


  • 以管理员身份打开PowerShell并运行set executionpolicy-scope currentuser
  • 提供远程签名并按Enter键
  • 运行set executionpolicy-scope currentuser
  • 不受限制地提供并按Enter键

  • 在PowerShellISE编辑器中,我发现首先允许运行以下行脚本。

    1
    Set-ExecutionPolicy RemoteSigned -Scope Process

    在PowerShell 2.0中,默认情况下执行策略设置为禁用。

    从那时起,PowerShell团队做了很多改进,他们相信用户在运行脚本时不会破坏很多东西。因此,从PowerShell4.0开始,默认情况下启用它。

    在您的例子中,从PowerShell控制台键入Set-ExecutionPolicy RemoteSigned,然后说是。


    转到注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell并将ExecutionPolicy设置为RemoteSigned


    如果您在这里是因为使用Ruby或Chef运行它并使用``系统执行,请执行以下操作:

    1
    `powershell.exe -ExecutionPolicy Unrestricted -command [Environment]::GetFolderPath(\'mydocuments\')`

    该命令用于获取"mydocuments"文件夹。

    -ExecutionPolicy Unrestricted做了这个把戏。

    希望对别人有帮助。


    几个答案指向执行策略。然而,有些事情也需要"runas管理员"。这是最安全的,因为执行策略没有永久性的更改,并且可以通过管理员的限制。与schedtask一起使用可启动批处理:

    1
        runas.exe /savecred /user:administrator powershell -ExecutionPolicy ByPass -File script.ps1

    来自上面的jack edmonds和post的peter mortensen/dhana,如何在命令提示符下以"以管理员身份运行"的身份运行应用程序?


    以管理员身份打开PowerShell窗口。它会起作用的。


    我今天也遇到了同样的问题。64位执行策略是不受限制的,而32位是受限制的。

    以下是如何远程更改32位策略:

    1
    Invoke-Command -ComputerName $servername -ConfigurationName Microsoft.PowerShell32 -scriptblock {Set-ExecutionPolicy unrestricted}

    我发现这一行对我的一个Windows Server 2008 R2服务器最有效。在我的PowerShell脚本中,如果没有这一行,其他一些人就没有问题:

    1
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force -Scope Process