当我尝试执行PowerShell脚本时,出现以下错误:
无法加载文件C:\ Common \ Scripts \ hello.ps1,因为在此系统上禁用了脚本的执行。请参阅“获取有关about_signing的帮助”以了解更多详细信息。
在第1行:char:13
+。\ hello.ps1 <<<<
+ CategoryInfo:未指定:(:) [],PSSecurityException
+ FullyQualifiedErrorId:RuntimeException
当我尝试执行PowerShell脚本时,出现以下错误:
无法加载文件C:\ Common \ Scripts \ hello.ps1,因为在此系统上禁用了脚本的执行。请参阅“获取有关about_signing的帮助”以了解更多详细信息。
在第1行:char:13
+。\ hello.ps1 <<<<
+ CategoryInfo:未指定:(:) [],PSSecurityException
+ FullyQualifiedErrorId:RuntimeException
Answers:
使用“以管理员身份运行”选项启动Windows PowerShell。只有计算机上Administrators组的成员才能更改执行策略。
通过输入以下命令来启用运行未签名的脚本:
set-executionpolicy remotesigned
这将允许您运行在本地计算机上编写的未签名脚本以及来自Internet的已签名脚本。
另请参阅Microsoft TechNet库中的运行脚本。
默认执行策略设置为受限,您可以通过键入以下内容进行查看:
Get-ExecutionPolicy
您应该键入以下内容使其进入非限制模式:
Set-ExecutionPolicy unrestricted
希望这可以帮助
RemoteSigned
不阻止复制和粘贴,不阻止git或其他非IE下载方法,那么它有什么用?跟我说:“绝对没有!”。我认为要求脚本使用$ 100的代码签名证书进行签名是没有用的,愚蠢的,并且否定了体面的脚本语言可以为Windows所做的所有好处。话虽这么说,如果前进的方式是让用户了解他们使用PS脚本的行为,那么我们可能会做的……Nahhhh,那将永远行不通;-)
在用于开发脚本的计算机上,将如上所述使用-unrestricted。但是,当将脚本部署到最终用户计算机时,我将只使用-executionpolicy开关调用powershell:
powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1
我们可以通过以下命令获取当前ExecutionPolicy的状态:
Get-ExecutionPolicy;
默认情况下,它是Restricted。为了允许执行PowerShell脚本,我们需要将此ExecutionPolicy设置为Bypass或Unrestricted。
我们可以使用Bypass
或Unrestricted
使用以下任何PowerShell命令为Current User设置策略:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force;
不受限制的策略将加载所有配置文件并运行所有脚本。如果您运行从Internet下载的未签名脚本,则会在运行之前提示您获得许可。
而在“ 绕过”策略中,没有任何内容被阻止,并且在脚本执行过程中没有警告或提示。绕过执行政策比不受限制更宽松。
根据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
从文档中:
绕过:没有任何障碍,也没有警告或提示。
这显然是不安全的,请了解所涉及的风险。
带有以下项的
注册表项: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"
确实也可以。
由于某些原因,PowerShell cmdlet不能仅在本地用户上下文中全局启用本地执行。例如,如果我尝试从CygWin的bash提示符下启动Powershell脚本,该脚本在其自己的用户上下文下运行,则它将无法运行,并出现“未进行数字签名”错误。答案是进入本地组策略编辑器->本地计算机策略->管理模板-> Windows组件-> Windows PowerShell,然后双击“打开脚本执行”。然后,这让我将其更改为“已启用”,然后将其执行策略设为“允许本地脚本和远程签名脚本”,并使其在全局范围内起作用,而与用户上下文无关。
可接受的答案是正确的,但是策略修改仅适用于当前正在运行的Powershell实例,这意味着一旦关闭Powershell实例即可。该策略将被重置。如果用户重新打开Powershell的另一个实例,则将应用默认策略,即Restricted
对我来说,我需要使用VisualStudio Code控制台和cygwin的g ++来构建东西。控制台使用Powershell,使用默认策略,则无法执行任何操作。一种解决方案是每次在VisualStudio Code控制台中触发控制台时都更改策略,也许是更改策略的脚本。
我很懒,所以另一个解决方案是在管理员模式下运行Powershell,类似于接受的答案。但带有一个额外的参数,该参数会更改注册表中的值。一旦完成。RemoteSigned
默认情况下,其他Powershell实例将使用该策略。
set-executionpolicy remotesigned -Scope CurrentUser
reg键起作用的原因是因为它确实在执行PS命令。这些命令将更改写入reg键。与创建注册表项或深入研究注册表相比,命令要快捷,容易得多。