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


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


#1 楼


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

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

set-executionpolicy remotesigned



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

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

评论


这将永久更改策略,还是每次重启计算机时都必须这样做?

–雷
17年1月14日在18:11

@Ray这将永久更改策略。

– Pavel Chuchuva
17年1月14日在22:15

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

– jpmc26
18年7月17日在18:38

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

–FabioSpaghetti
19年7月16日在10:14

我要提到的是,您需要在普通Power Shell中执行两次,然后在Windows PowerShell(x86)中再次执行一次。这是非常意外的,但是两者有不同的策略集。


19-10-29在23:30

#2 楼

默认执行策略设置为受限,您可以通过运行Get-ExecutionPolicy来查看它:
Get-ExecutionPolicy

像这样运行Set-ExecutionPolicy以切换到非受限模式:

评论


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

–古斯
2012年11月11日10:41



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

–约书亚
19年6月11日在21:14

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

–古斯
19年6月11日在23:23



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

–约书亚
19年6月11日23:36

#3 楼

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

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


评论


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

–杰伊·巴祖兹(Jay Bazuzi)
13年1月14日在20:30

真好!我一直在部署winrar rarlabs.com制造的sfx

– MDMoore313
2013年1月15日16:09

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

–卡米尔·索特(Kamil Szot)
2014年4月19日在21:10



#4 楼

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

Get-ExecutionPolicy;


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

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

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
16-10-25在1:39

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

–约书亚
19年6月11日23:37

@约书亚我不知道。您能给我该声明的来文吗?我尝试了一个休闲的google,但我显然错了。

–Wyatt8740
19年6月12日在8:25

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

–约书亚
19年6月12日在14:59

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

–Wyatt8740
19年6月12日18:38



#6 楼

具有以下内容的.reg文件:

Windows Registry Editor Version 5.00

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


和:

Windows Registry Editor Version 5.00

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


确实也可以工作。

评论


您必须在每个键之后重新换行,否则将无法正常工作

–Nightcap79
11月4日7:22



#7 楼

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

#8 楼

可接受的答案是正确的,但是策略修改仅适用于当前正在运行的Powershell实例,这意味着一旦关闭Powershell实例即可。该策略将被重置。如果用户重新打开Powershell的另一个实例,则将应用默认策略Restricted对我来说,我需要使用VisualStudio Code控制台和cygwin的g ++进行构建。控制台使用Powershell,并且具有默认策略,无法执行任何操作。一种解决方案是每次在Visual Studio Code控制台中启动控制台时都更改策略,也许是更改策略的脚本。

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

set-executionpolicy remotesigned -Scope CurrentUser

#9 楼

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

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

这不是最佳解决方案,对自动化任务几乎没有帮助,但是它确实允许我在不运行时使用PowerShell并进行实用违反了我的IS部门。

#10 楼


打开开始。
搜索PowerShell,右键单击顶部结果,然后单击“以管理员身份运行”选项。

键入以下命令以允许脚本运行,然后按Enter :

Set-ExecutionPolicy RemoteSigned


键入A并按Enter(如果适用)。

键入以下命令以运行脚本并按Enter:

& "C:\PATH\TO\SCRIPT\first_script.ps1"


在上面的命令中,请确保将“ PATH \ TO \ SCRIPT”更改为脚本的位置。


完成这些步骤后,脚本将运行,并且如果脚本制作正确,则应该看到其输出没有问题。

#11 楼

请注意:
请勿使用PowerShell ISE以脚本形式运行set-executionpolicy remotesigned命令。
在我的情况下不起作用。
在提升的PowerShell中运行它-请逐步进行操作- Pavel Chuchuva提供的步骤建议。

#12 楼

如果您是从Internet下载的.ps1,则右键单击属性上可能会有一个取消阻止按钮,只需单击它即可。

#13 楼

在我的本地计算机上,我通过将执行策略设置为“绕过”来解决问题。


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


通过输入以下命令启用运行未签名的脚本:
set-executionpolicy Bypass

(键入A并按Enter键接受所有问题)。



#14 楼

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

评论


这是错误的:在其他答案中提到的键会更改Powershell执行策略,从而使Powershell脚本能够运行。

– Patrick R.
18年4月5日在14:04