PowerShell 说 “在该系统上禁用了脚本执行”。

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

无法加载Management_Install.ps1因为在此系统上禁用了脚本的执行。

我跑了

Set-ExecutionPolicy -ExecutionPolicy Unrestricted

当我从运行Get-ExecutionPolicy时,我得到了Unrestricted

PS C:\Users\Administrator\> Get-ExecutionPolicy
Unrestricted

C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> powershell .\Management_Install.ps1 1

WARNING: Running x86 PowerShell...

无法加载文件C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\Management_Install.ps1因为此系统上禁用了脚本的执行。请参阅 “ get-help about_signing ” 以获取更多详细信息。

在线:1 字符:25

  • .\Management_Install.ps1 <<<< 1

    • CategoryInfo:未指定:(:) [],PSSecurityException

    • FullyQualifiedErrorId:RuntimeException

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

Press any key to continue . . .

系统是 Windows Server 2008R2。

我究竟做错了什么?

答案

如果您使用的是Windows Server 2008 R2,则必须安装x64x86版本的 PowerShell,这两个版本都必须设置其执行策略。您是否在两台主机上都设置了执行策略?

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

Set-ExecutionPolicy RemoteSigned

有关更多信息,请参见使用 Set-ExecutionPolicy Cmdlet

您可以通过在运行 PowerShell 时添加-ExecutionPolicy Bypass来绕过单个文件的此策略

powershell -ExecutionPolicy Bypass -File script.ps1

我遇到了类似的问题,并注意到Windows Server 2012上的默认cmd正在运行 x64。

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

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

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

您可以使用以下方式检查模式

  • 在 CMD 中: echo %PROCESSOR_ARCHITECTURE%
  • 在 Powershell 中: [Environment]::Is64BitProcess

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

大多数现有的答案解释如何 ,却很少解释为什么 。并且,在四处执行来自 Internet 上陌生人的代码(尤其是禁用安全措施的代码)之前,您应该确切地了解自己在做什么。因此,这里有更多有关此问题的详细信息。

从 TechNet 关于执行策略页面

Windows PowerShell 执行策略使您可以确定 Windows PowerShell 加载配置文件和运行脚本的条件。

PowerShell 基础知识 - 执行策略和代码签名所列举的,其优点是:

  • 执行控制 - 控制执行脚本的信任级别。
  • Command Highjack-防止在我的路径中注入命令。
  • 身份 - 由我信任的开发人员创建和签名的脚本,和 / 或由我信任的证书颁发机构颁发的证书签名的脚本。
  • 完整性 - 脚本不能被恶意软件或恶意用户修改。

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

为此,您将运行Set-ExecutionPolicy cmdlet。

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

执行策略类型:

  • Restricted - 无法在系统上执行本地,远程或下载的脚本。
  • AllSigned运行的所有脚本都需要进行数字签名。
  • RemoteSigned所有远程脚本(UNC)或下载的都需要签名。
  • Unrestricted - 不需要任何类型的脚本的签名。

新变更范围

  • LocalMachine - 执行策略会影响计算机的所有用户。
  • CurrentUser执行策略仅影响当前用户。
  • Process - 执行策略仅影响当前的 Windows PowerShell 进程。

†= 默认

例如 :如果仅要将 CurrentUser 的策略更改为 RemoteSigned,则可以运行以下命令:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

注意 :为了更改执行策略,您必须正在运行PowerShell As Adminstrator 。如果您处于常规模式下并尝试更改执行策略,则会收到以下错误:

拒绝访问注册表项'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell'。若要更改默认(LocalMachine)范围的执行策略,请使用 “以管理员身份运行” 选项启动 Windows PowerShell。

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

注意 :大多数人在打开 Powershell 时很可能会收到此错误,因为 PS 启动时试图做的第一件事是执行您的用户配置文件脚本来设置您喜欢的环境。

该文件通常位于:

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

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

$profile

如果您在配置文件中不需要任何内容,并且不想大惊小怪的安全设置,则可以将其删除,而 powershell 将找不到它无法执行的任何操作。

在 Windows 7 中:

转到 “开始” 菜单,然后搜索 “Windows PowerShell ISE”。

右键单击 x86 版本,然后选择 “以管理员身份运行”。

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

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

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

在脚本还解决问题之前,还要运行此命令:

set-executionpolicy unrestricted

如果您所在的环境不是管理员,则可以只为您设置执行策略,并且不需要管理员。

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

要么

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

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

Help Get-ExecutionPolicy -Full
Help Set-ExecutionPolicy -Full

我们可以通过以下命令获取当前ExecutionPolicy的状态:

Get-ExecutionPolicy;

默认情况下,它是Restricted 。为了允许执行 PowerShell 脚本,我们需要将此 ExecutionPolicy 设置为BypassUnrestricted

我们可以使用以下任何 PowerShell 命令将 “当前用户” 的策略设置为 “ Bypass或 “ Unrestricted

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;

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

不受限制的策略将加载所有配置文件并运行所有脚本。如果运行从 Internet 下载的未签名脚本,则会在运行之前提示您获得许可。

而在 “ 绕过”策略中,没有任何内容被阻止,并且在脚本执行过程中没有警告或提示。绕过ExecutionPolicyUnrestricted

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

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

Set-ExecutionPolicy RemoteSigned

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

[x64]

  1. 以管理员身份打开 C:\ Windows \ SysWOW64 \ cmd.exe
  2. 运行命令 > powershell Set-ExecutionPolicy Unrestricted

但这没有用。它是有限的。 Windows10 可能是新的安全策略。我有这个错误:

Set-ExecutionPolicy:Windows PowerShell 成功更新了您的执行策略,但是该设置被在更特定范围内定义的策略覆盖。由于覆盖,您的外壳将保留其当前有效的执行策略...

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

  1. 打开运行命令 / 控制台( Win + R
  2. 类型: gpedit.msc组策略编辑器)
  3. 浏览到本地计算机策略 -> 计算机配置 -> 管理模板 -> Windows 组件 -> Windows Powershell
  4. 启用 “ 打开脚本执行
  5. 根据需要设置策略。我将我的设置为 “ 允许所有脚本 ”。

现在打开 PowerShell 并享受;)