题 PowerShell说“在这个系统上禁用了脚本的执行。”


我正在尝试运行从命令提示符调用PowerShell脚本的.cmd文件,我收到以下错误:

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

我跑了 set-executionpolicy unrestricted 当我跑 get-executionpolicy 从PowerShell我得到 unrestricted 背部。

// Powershell的输出

PS C:\ Users \ Administrator> get-executionpolicy

无限制

//从DOS输出

C:\ Projects \ Microsoft.Practices.ESB \ Source \ Samples \ Management Portal \ Install \ Scr

ipts> powershell。\ Management_Install.ps1 1

警告:运行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:NotSpecified:(:) [],PSSecurityException

    • FullyQualifiedErrorId:RuntimeException

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

按任意键继续 。 。 。

该系统是Windows Server 2008 R2。

我究竟做错了什么?


1282
2017-10-27 21:39


起源


没有看起来交配,我以管理员身份登录,并以“管理员”的身份运行并获得与上述相同的结果... - Conor
得到它的底部,错误是误导,问题是在我的powershell脚本,谢谢! - Conor
@ChristopheD错了。除非您知道原因,否则不要以管理员身份运行这是一个危险的习惯,也是解决你不理解的问题的坏方法 - Kolob Canyon
@KolobCanyon是的,但它经常令人惊讶地工作。 - Erhannis
值得指出的是,执行策略包含多个范围,以不同方式运行PowerShell可以为您提供不同的策略。要查看策略列表,请运行 Get-ExecutionPolicy -List。 - Bacon Bits


答案:


如果你正在使用 Windows Server 2008 R2然后有一个 64位 和 86 PowerShell的两个版本都必须设置其执行策略。您是否在两台主机上设置了执行策略?

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

Set-ExecutionPolicy RemoteSigned

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


1697
2017-10-28 01:16



谢谢。运行 C:\Windows\SysWOW64\WindowsPowerShell\v1.0\ powershell.exe 那么,作为管理员 Set-ExecutionPolicy RemoteSigned 帮助! - Glen Little
Set-ExecutionPolicy Restricted 如果你想将权限恢复原状,似乎是撤消它的方法: technet.microsoft.com/en-us/library/ee176961.aspx。临时旁路方法 @Jack Edmonds 看起来对我来说更安全: powershell -ExecutionPolicy ByPass -File script.ps1 - SharpC
我没有尝试旁路路由,但Set / Reset方法允许我在VS2013中NUGET安装/卸载jQuery UI 1.11.2。谢谢! - Analytic Lunatic
要获得更安全的策略,请将其范围限定为实际用户:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser - Nuno Aniceto
谢谢。这对我有用。以管理员身份在PowerShell中执行该命令。 - BenJaminSila


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

powershell -ExecutionPolicy ByPass -File script.ps1

541
2018-02-06 21:28



正确而不是默认情况下打开所有内容,因此懒惰或无知的系统管理员可以了解微软产品的易受攻击性 - Luis
更改系统策略不应该是一个默认的解决方案,除非你真的想过它。因此,作为第一步,该解决方案似乎应该是优选的。 - user1020853
路易斯,但它默认是开放的。只是你必须在运行它时添加/ google以获得更多的东西。它是愚蠢的,你有一个powershell,然后你可以运行它。 - Lassi Kinnunen
Hillarious。现在,当我看到一部黑客写命令的电影时,我会笑一笑 decrypt data 要么 hack the system。 ExecutionPolicy Bypass 看起来就像那个:) - gluk47
给所有无知评论员的一份说明。你说的好像这里没有鸡肉和鸡蛋问题。您无法从powershell脚本运行此命令。它需要直接用户输入。就像计算机历史中每个操作系统上的所有其他安全功能一样,可以使用正确的权限和方法关闭它。 - Preston


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

对于 Windows 7的Windows 8Windows Server 2008 R2 要么 Windows Server 2012,运行以下命令 管理员

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

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

您可以使用检查模式

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

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


108
2017-08-30 13:10



你似乎把“x86”标记为“x64”,反之亦然? - Olivier Dulac
谢谢,有人重新格式化了它 - Ralph Willgoss
@RalphWillgoss阻止尝试交换示例,如果需要采取进一步措施,请告知我们 stackoverflow.com/review/suggested-edits/15088371 - Samuel Liew♦
修改@SamuelLiew以适应预期编辑的意图。谢谢 - Ralph Willgoss


大多数现有的答案解释了 怎么样,但很少解释 为什么。在你从互联网上的陌生人执行代码之前,特别是禁用安全措施的代码之前,你应该准确理解你在做什么。所以这里有关于这个问题的更多细节。

来自TechNet 关于执行政策页面

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

其中的好处,如列举 PowerShell基础知识 - 执行策略和代码签名, 是:

  • 控制执行  - 控制执行脚本的信任级别。
  • 命令劫持  - 防止在我的路径中注入命令。
  • 身分  - 脚本是否由我信任的开发人员创建和签名,和/或使用我信任的证书颁发机构的证书签名。
  • 廉正  - 恶意软件或恶意用户无法修改脚本。

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

要做到这一点,你将运行 Set-ExecutionPolicy 小命令。

在更新执行策略时,您将做出两个重大决策。

执行政策类型:

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

新变化的范围

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

†=默认

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

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

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

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

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

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

该文件通常位于:

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

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

$profile

如果在配置文件中没有您关心的任何内容,并且不想对您的安全设置大惊小怪,您可以删除它并且powershell将找不到任何无法执行的内容。


91
2017-11-16 08:05



我觉得重要的是要注意,虽然执行策略是一种安全措施,但并不是要阻止用户执行PowerShell代码。执行政策是预期的 保护你的脚本 并确定谁编写,修改或批准他们,这就是全部。这是微不足道的 绕过执行政策用简单的东西 Get-Content .\MyFile.ps1 | powershell.exe -NoProfile -。 - Bacon Bits
鉴于存在 -ExecutionPolicy ByPass 但是,这个政策的目的是什么呢?是否只是为了防止用户意外打开PowerShell控制台并运行恶意脚本?攻击者难道只是想使用可执行文件或批处理脚本来解决这个问题吗?即使在阅读@BaconBits评论之后,我也不太确定这个政策的目的是什么? - Ajedi32
@ Ajedi32说我有一个在网络共享上运行脚本的任务。当我调用我的脚本时,我希望我的进程验证脚本是否已签名。我希望我的代码能够仔细检查我要运行的脚本是否是我信任的代码。我不在乎你是否可以运行我的代码。停止这是访问权限的工作。我只是想阻止你让我运行我没写的代码。访问权限意味着操作系统会阻止您在登录时修改我的代码。代码签名和执行策略意味着我的脚本未被修改 一世 去运行它。 - Bacon Bits


在Windows 7中:

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

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

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

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

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


33
2017-12-04 05:25



我需要为64位和32位版本执行此操作。谢谢你的提示。 - Nick


在脚本之前运行此命令也可以解决问题:

set-executionpolicy unrestricted

33
2018-03-27 06:11



-1 - 遵循最少许可原则。至少将策略设置为 RemoteSigned 在删除对安全策略的所有限制之前。如果这不起作用,那么重新评估你的痛点是什么以及它为什么不起作用。你可以设置 unrestricted 作为最后的手段,但它不应该是你的起点。 - KyleMit
谢谢你指出这个选项。由于对生产目的的安全需求充分尊重,在快速原型制作能力需求如此之高的时代,所有的策略和安全性确实妨碍了完成工作。 - tishma
关于评论重新原型,我担心这就是为什么糟糕的代码投入生产。当然这只是一个微不足道的例子,但是如果你在开发过程中无法解决这个微不足道的事情,那就是发布的担忧。此外,对于定制代码,如果可以,了解目标环境 - 我们将大部分内部系统设置为 Remotesigned。 - Trix


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

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

要么

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

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

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

26
2017-11-19 19:13



在Windows 8中为我工作很棒,即使在 Set-ExecutionPolicy Unrestricted 作为管理员似乎没有“不受限制”足以实际帮助。 - patridge
我相信您可能遇到的是GPO或其他覆盖ExecutionPolicy“LocalMachine”级别设置的内容。您无法使用Set-ExecutionPolicy命令覆盖域策略的适用范围。但是,但是设置“CurrentUser”访问级别,您和您将只拥有指定的执行策略。这是因为计算机在查看LocalMachine设置之前会查看CurrentUser的执行策略。 - Micah 'Powershell Ninja'
Set-ExecutionPolicy -Scope“CurrentUser”-ExecutionPolicy“Unrestricted”是唯一对我有用的解决方案。谢谢 - Paulj


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

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

Set-ExecutionPolicy RemoteSigned

22
2017-07-20 12:37





我在用着 Windows 10 并且无法运行任何命令。给我一些线索的唯一命令就是:

[64]

  1. 打开C:\ Windows \ SysWOW64 \ cmd.exe [以管理员身份]
  2. 运行命令> powershell Set-ExecutionPolicy不受限制

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

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

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

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

现在打开PowerShell并享受;)


16
2017-09-01 09:32



这是一个独立的安装,还是您连接到工作组或域? - MEMark
为什么要打开cmd来做呢?只需打开ISE(作为管理员)并输入 Set-ExecutionPolicy RemoteSigned - Kolob Canyon


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

Get-ExecutionPolicy;

默认情况下是 受限。为了允许执行PowerShell脚本,我们需要将此ExecutionPolicy设置为 旁路 要么 无限制

我们可以将当前用户的策略设置为 Bypass 要么 Unrestricted 通过使用以下任何PowerShell命令:

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

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

无限制 policy加载所有配置文件并运行所有脚本。如果运行从Internet下载的未签名脚本,则会在运行前提示您获得权限。

而在 旁路 策略,没有任何内容被阻止,脚本执行期间没有警告或提示。旁路 ExecutionPolicy 比起来更轻松 Unrestricted


10
2017-09-07 07:00



Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;  快速而又肮脏的方式告诉VS2015停止抱怨并运行我的血腥脚本。谢谢。救星。 - Eon
是的,这应该更高,因为一些脚本没有经过数字签名 - Gaspa79


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


9
2017-08-25 00:33



这很好知道。它没有详细记录,它是特定于环境的! - Chad Carisch