如何启用PowerShell脚本执行?


260

当我尝试执行PowerShell脚本时,出现以下错误:

无法加载文件C:\ Common \ Scripts \ hello.ps1,因为在此系统上禁用了脚本的执行。请参阅“获取有关about_signing的帮助”以了解更多详细信息。
在第1行:char:13
+。\ hello.ps1 <<<<
+ CategoryInfo:未指定:(:) [],PSSecurityException
+ FullyQualifiedErrorId:RuntimeException

Answers:


399
  1. 使用“以管理员身份运行”选项启动Windows PowerShell。只有计算机上Administrators组的成员才能更改执行策略。

  2. 通过输入以下命令来启用运行未签名的脚本:

    set-executionpolicy remotesigned
    

这将允许您运行在本地计算机上编写的未签名脚本以及来自Internet的已签名脚本。

另请参阅Microsoft TechNet库中的运行脚本


3
这会永久更改策略吗?还是我每次重新启动计算机时都必须这样做?

1
@Ray这将永久更改策略。
帕维尔·楚楚瓦

1
@Ray请参阅文档。默认情况下,它将设置为LocalMachine。要设置其他范围(CurrentUserProcess),请-Scope显式传递。
jpmc26

@PavelChuchuva我应该在您想要的脚本顶部添加此行
FabioSpaghetti,

@FabioSpaghetti无需在脚本中添加任何内容。按照以下步骤执行一次该命令。
Pavel Chuchuva

74

默认执行策略设置为受限,您可以通过键入以下内容进行查看:

Get-ExecutionPolicy

您应该键入以下内容使其进入非限制模式:

Set-ExecutionPolicy unrestricted

希望这可以帮助


13
如果您希望用户从Internet复制并粘贴恶意脚本,则需要签名是有意义的。如果您认为用户不是愚蠢的,那么“远程签名”不会增加任何安全性,并且会给生活带来困难。
格斯2012年

@Guss:在测试时,我发现RemoteSigned不再需要对本地生成的.ps1文件进行签名,并且将git source control视为本地源。
约书亚

@约书亚-是的,我的意思是正确的。如果RemoteSigned不阻止复制和粘贴,不阻止git或其他非IE下载方法,那么它有什么用?跟我说:“绝对没有!”。我认为要求脚本使用$ 100的代码签名证书进行签名是没有用的,愚蠢的,并且否定了体面的脚本语言可以为Windows所做的所有好处。话虽这么说,如果前进的方式是让用户了解他们使用PS脚本的行为,那么我们可能会做的……Nahhhh,那将永远行不通;-)
Guss

@Guss:我已经在Windows上有了很好的脚本语言。Cygwin在Windows 10上运行良好。实际上比以前的任何Windows版本都好得多。我只想运行别人已经写过的脚本。
约书亚

61

在用于开发脚本的计算机上,将如上所述使用-unrestricted。但是,当将脚本部署到最终用户计算机时,我将只使用-executionpolicy开关调用powershell:

powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1

2
您可能需要将此技巧与.CMD文件中的多语言技巧结合使用。参见stackoverflow.com/a/8597794/5314
Jay Bazuzi 2013年

真好!我一直在部署winrar rarlabs.com
MDMoore313,2013年

1
这个技巧使我可以从Git Bash(MINGW32 bash)运行powershell脚本
Kamil Szot 2014年

16

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

Get-ExecutionPolicy;

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

我们可以使用BypassUnrestricted使用以下任何PowerShell命令为Current User设置策略:

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

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

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

而在“ 绕过”策略中,没有任何内容被阻止,并且在脚本执行过程中没有警告或提示。绕过执行政策比不受限制更宽松。


5

根据Windows版本和配置的不同,即使在Unrestricted模式下,您也可能会有以下警告:

Security warning
Run only scripts that you trust. While scripts from the internet can be useful, this
script can potentially harm your computer. If you trust this script, use the 
Unblock-File cmdlet to allow the script to run without this warning message. 
Do you want to run?
[D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D")

解决方案是使用通过以下命令启用的“旁路”策略:

Set-ExecutionPolicy Bypass

文档中

绕过:没有任何障碍,也没有警告或提示。

这显然是不安全的,请了解所涉及的风险。


这是我能够在Powershell 2.0的WINE环境中运行脚本的唯一方法。谢谢。
Wyatt8740

@ Wyatt8740:因为wine将所有驱动器显示为网络驱动器。
约书亚

@约书亚我不知道。您能为我提供一份声明的来源吗?我尝试了一个休闲的google,但我显然错了。
Wyatt8740

@ Wyatt8740:来源:Wine OpenFileName通用对话框。看驱动器图标。
约书亚

@Joshua我的意思是源代码;图标可能是任意的。但是我没有想到这一点。我想这是一个不错的起点(编辑:看起来好像他们不在这里。)
Wyatt8740

2

带有以下项的
注册表项:Windows注册表编辑器版本5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows \ PowerShell]“ EnableScripts” = dword:00000001“ ExecutionPolicy” =“绕过”

和:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell]
"EnableScripts"=dword:00000001 "ExecutionPolicy"="Unrestricted"

确实也可以。


1

由于某些原因,PowerShell cmdlet不能仅在本地用户上下文中全局启用本地执行。例如,如果我尝试从CygWin的bash提示符下启动Powershell脚本,该脚本在其自己的用户上下文下运行,则它将无法运行,并出现“未进行数字签名”错误。答案是进入本地组策略编辑器->本地计算机策略->管理模板-> Windows组件-> Windows PowerShell,然后双击“打开脚本执行”。然后,这让我将其更改为“已启用”,然后将其执行策略设为“允许本地脚本和远程签名脚本”,并使其在全局范围内起作用,而与用户上下文无关。


0

可接受的答案是正确的,但是策略修改仅适用于当前正在运行的Powershell实例,这意味着一旦关闭Powershell实例即可。该策略将被重置。如果用户重新打开Powershell的另一个实例,则将应用默认策略,即Restricted

对我来说,我需要使用VisualStudio Code控制台和cygwin的g ++来构建东西。控制台使用Powershell,使用默认策略,则无法执行任何操作。一种解决方案是每次在VisualStudio Code控制台中触发控制台时都更改策略,也许是更改策略的脚本。

我很懒,所以另一个解决方案是在管理员模式下运行Powershell,类似于接受的答案。但带有一个额外的参数,该参数会更改注册表中的值。一旦完成。RemoteSigned默认情况下,其他Powershell实例将使用该策略。

set-executionpolicy remotesigned -Scope CurrentUser


0

(正确)设置策略是最佳选择,但是在我的受管系统上,我无法更改该策略。

对我来说,更改策略的最简单的解决方法是在“ PowerShell ISE”中打开脚本 ,突出显示要执行的代码(或部分代码),然后单击“运行选择”按钮(或使用F8捷径)。

这不是最佳解决方案,并且对自动化任务几乎没有帮助,但是它确实允许我使用PowerShell并使用PowerShell实用程序,同时又不影响IS部门。


-2

reg键起作用的原因是因为它确实在执行PS命令。这些命令将更改写入reg键。与创建注册表项或深入研究注册表相比,命令要快捷,容易得多。


1
这是错误的:在其他答案中提到的键会更改Powershell执行策略,从而使Powershell脚本能够运行。
Patrick R.
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.