PowerShell说“此系统上的脚本执行被禁用。”


1760

我正在尝试运行 调用一个文件 的脚本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。

我究竟做错了什么?


3
没看头,我以管理员身份登录,还以“管理员”身份运行,并得到了与上述相同的结果……
Conor 2010年

2
归根到底,错误是令人误解的,问题出在我的PowerShell脚本中,谢谢!
科纳尔

值得指出的是,执行策略具有多个作用域,以不同方式运行PowerShell可以为您提供不同的策略。要查看策略列表,请运行Get-ExecutionPolicy -List
培根钻头

Answers:


2238

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

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

Set-ExecutionPolicy RemoteSigned

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

完成后,可以使用以下方法将策略设置回其默认值:

Set-ExecutionPolicy Restricted

141
Set-ExecutionPolicy Restricted如果您想将权限恢复为原来的样子,似乎是撤消操作的方法:technet.microsoft.com/zh-cn/library/ee176961.aspx。临时旁路方法@Jack Edmonds对我来说看起来更安全:powershell -ExecutionPolicy ByPass -File script.ps1
SharpC

33
为获得更安全的策略,请将其范围设置为实际用户:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Nuno Aniceto

Set-ExecutionPolicy RemoteSigned不能是脚本的第一行。如果是这样,请突出显示它并在运行其余脚本之前仅运行INITIALLY。
ozzy432836

我碰到过类似的问题来到现场SF,“在SQL Server中PowerShell执行政策”要求10月10日'14,包括有答案Get-ExecutionPolicy -List这让我看到了不同的范围。在CMD Get-ExecutionPolicy不显示所有范围。 Import-Module SQLPS现在有工作改变策略如下:{Undefined- Process,MachinePolicy,UserPolicy,}; {RemoteSigned- CurrentUser, LocalMachine}
SherlockSpreadsheets

如果执行此操作,更改是否仅在当前PowerShell期间有效?还是比那更大?
威廉·乔科什

709

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

powershell -ExecutionPolicy Bypass -File script.ps1

3
如果您使用的是非管理员帐户,这也非常方便。我%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass在任务栏上做了一个快捷方式。
zek19 2015年

3
请注意,Microsoft Technet将其样式化为“绕过”,而不是“绕过”。请参阅:technet.microsoft.com/nl-nl/library/hh849812.aspx
Jelle Geerts

1
这对我不起作用,我获得了与正常调用一样的拒绝权限。不过,从.bat调用ps1 type script.ps1 | powershell -确实可以。
Some_Guy

8
执行策略的目的是防止人们双击a .ps1并意外运行他们不想要的内容。这将在.bat文件中发生
Kolob Canyon

你救了我的日子,谢谢你的回答。
Arpit Patel

162

我有一个类似的问题,并指出Windows Server 2012cmd上的默认值运行的是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位目录说明


132

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

从TechNet 关于执行策略页面

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

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

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

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

为此,您将运行该Set-ExecutionPolicycmdlet。

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

执行策略类型:

  • 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将找不到它无法执行的任何操作。


8
我觉得重要的是要注意,虽然执行策略是一种安全措施,但并不是要防止用户执行PowerShell代码。执行策略旨在保护您的脚本并确定谁编写,修改或批准了脚本,仅此而已。这是微不足道的避开执行策略的东西一样简单Get-Content .\MyFile.ps1 | powershell.exe -NoProfile -
培根钻头

1
鉴于存在,-ExecutionPolicy ByPass该政策的目的是什么?是否只是为了防止用户意外打开Powershell控制台并运行恶意脚本?如果攻击者想解决这个问题,难道不能只使用可执行文件或批处理脚本吗?即使在阅读@BaconBits评论之后,我也不太确定该政策是要防止什么情况发生……
Ajedi32 '16

2
@ Ajedi32说我有一个在网络共享上运行脚本的任务。调用脚本时,我希望我的进程验证脚本是否已签名。我希望我的代码再次检查要运行的脚本是否是我信任要运行的代码。我不在乎您是否可以运行我的代码。停止这就是访问权限的工作。我只是想防止您让我运行未编写的代码。访问权限意味着操作系统阻止您在登录时修改我的代码。代码签名和执行策略意味着我的脚本时没有被修改过去运行它。
培根钻头

40

在Windows 7中:

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

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

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

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

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


39

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

set-executionpolicy unrestricted

27
-1-遵循最小权限原则。在RemoteSigned消除对安全策略的所有限制之前,至少将策略设置为。如果那不起作用,那么请重新评估您的痛点以及为何不起作用。您可以将其设置unrestricted为万不得已的方法,但这不应该作为起点。
KyleMit 2014年

3
也感谢您指出此选项。在充分考虑到出于生产目的的安全需求的情况下,在快速原型能力需求如此之高的时代,所有策略和安全性确实妨碍了完成工作。
tishma

1
关于注释原型,这就是为什么糟糕的代码进入生产的原因。当然,这只是一个简单的例子,但是如果您在开发过程中无法解决这个琐碎的事情,那就很担心发布。另外,对于定制代码,如果可以的话,请了解目标环境-我们将大多数内部系统设置为Remotesigned
Trix

33

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

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

要么

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

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

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

在Windows 8中,对我来说非常有用,即使Set-ExecutionPolicy Unrestricted以管理员身份似乎“没有限制”也没有实际帮助。
巡逻

1
我相信您可能遇到的是GPO或其他内容,这些内容会覆盖您对ExecutionPolicy的“ LocalMachine”级别的设置。您不能使用Set-ExecutionPolicy命令覆盖域策略所具有的内容。但是,但是设置了“ CurrentUser”访问级别后,您和只有您将具有指定的执行策略。这是因为计算机在查看LocalMachine设置之前会先查看CurrentUser的执行策略。
米卡(Micah'Powershell Ninja')

1
Set-ExecutionPolicy -Scope“ CurrentUser” -ExecutionPolicy“ Unrestricted”是唯一适用于我的解决方案。谢谢
Paulj

32

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

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

Set-ExecutionPolicy RemoteSigned

正如其他文章所建议的那样:明智的做法是,包括“ -Scope CurrentUser”以获得更安全的策略。
clusterdude

32

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

Get-ExecutionPolicy;

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

我们可以为当前用户为策略BypassUnrestricted通过使用任何下面的PowerShell命令:

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

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

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

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


4
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force; 又一种告诉VS2015停止抱怨并运行我该死的脚本的快速又肮脏的方法。谢谢。救生员。
2016年

1
命令末尾的分号是多余的。
Bill_Stewart

23

我正在使用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并享受;)


这是独立安装,还是您已连接到工作组或域?
2015年

为什么要打开cmd呢?只需打开ISE(作为管理员)并输入Set-ExecutionPolicy RemoteSigned
Kolob Canyon

天哪,这终于解决了我的win10盒子,@ kolob set-executionpolicy还不够
xer0x

您不应该使用Unrestricted。这是更好的做法是使用RemoteSigned
科罗布峡谷

@ xer0x应该是只要你运行PowerShell中以管理员身份
科罗布峡谷

10

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


10

Win+ R并键入复制粘贴命令,然后按OK

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

并执行您的脚本。

然后还原更改,例如:

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

10

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

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

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

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


这可能是故障排除和了解此限制的更引人注目的指南之一。
Osvaldo Mercado

5
  1. 以管理员身份打开PowerShell并运行 Set-ExecutionPolicy -Scope CurrentUser
  2. 提供RemoteSigned,然后按Enter
  3. Set-ExecutionPolicy -Scope CurrentUser
  4. 提供不受限制,然后按Enter


3

在PowerShell ISE编辑器中,我发现运行以下第一行允许的脚本。

Set-ExecutionPolicy RemoteSigned -Scope Process

2

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

从那时起,PowerShell团队进行了许多改进,他们坚信用户在运行脚本时不会破坏很多东西。因此,从PowerShell 4.0开始,默认情况下将其启用。

在您的情况下,Set-ExecutionPolicy RemoteSigned从PowerShell控制台中键入并说是。


2

我今天有同样的问题。64位执行策略不受限制,而32位则受限制。

以下是仅远程更改32位策略的方法:

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

2

转到注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell并设置ExecutionPolicyRemoteSigned


1
1.以管理员身份打开PowerShell,运行Set-ExecutionPolicy -Scope CurrentUser 2.提供RemoteSigned并按Enter。3 .运行Set-ExecutionPolicy -Scope CurrentUser 4.提供不受限制的并按Enter
Ramanujam Allam,

2

尝试运行时,我再次收到警告 Set-ExecutionPolicy RemoteSigned

我用这个命令解决了

Set-ExecutionPolicy "RemoteSigned" -Scope Process -Confirm:$false

Set-ExecutionPolicy "RemoteSigned" -Scope CurrentUser -Confirm:$false

1

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

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

该命令用于获取“ MyDocuments”文件夹。

-ExecutionPolicy Unrestricted 绝招。

希望对其他人有帮助。


封闭的``真的应该在那里吗?
Peter Mortensen 2014年

1

有几个答案指向执行策略。但是,有些事情也需要“ runas管理员”。这是最安全的,因为不会对执行策略进行永久更改,并且可以摆脱管理员的限制。与schedtask一起使用以开始以下操作的批处理:

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

来自上面的Jack Edmonds和post的Peter Mortensen / Dhana 如何在命令提示符下以“以管理员身份运行”来运行应用程序?


1

我发现此行最适合我的Windows Server 2008 R2服务器之一。在我的PowerShell脚本中,没有此行,其他几个就没有问题:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force -Scope Process

1

以管理员身份打开Powershell控制台,然后设置执行策略

Set-ExecutionPolicy -ExecutionPolicy Remotesigned 

0

您可以使用一种特殊的方法来绕过它:

Get-Content "PS1scriptfullpath.ps1" | Powershell-NoProfile -

它将powershell脚本的内容通过管道传输到powershell.exe,并绕过执行策略执行该脚本。


0

这解决了我的问题

打开Windows PowerShell命令并在查询下面运行以进行更改ExecutionPolicy

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

如果要求确认更改,请按“ Y”,然后按Enter。



0
  1. 打开Powershell进行管理
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

使用此命令



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.