ChatGPT解决这个技术问题 Extra ChatGPT

为什么我的本地创建的脚本不允许在 RemoteSigned 执行策略下运行?

由于此问题继续吸引被问题主体驳斥或未解决实际问题的回复,请阅读您需要了解的简单摘要:这不是“为什么我的默认安装 PowerShell运行脚本?”问题。这不是“为什么我安装的 PowerShell 不能运行从 Internet 下载的脚本?”问题。问题是为什么 RemoteSigned 执行策略在不应该阻止脚本执行时阻止脚本执行。 RemoteSigned 是我要使用的唯一执行策略。我知道还有其他限制较少的政策可用。如果这些政策是可接受的替代品,我会直接使用它们,而这个问题将不存在。执行策略已设置为 RemoteSigned。将其从 RemoteSigned 更改为 RemoteSigned 不是解决方案。脚本文件在本地创建和存储。脚本文件未被阻止。脚本文件从未被阻止(参见前一点)。脚本文件不能被解除阻塞,因为没有什么可以解除阻塞(见前一点)。脚本文件由管理员(试图)执行。 Windows PowerShell 是唯一涉及的应用程序。与 Windows PowerShell ISE、命令提示符或任何其他工具或编辑器无关。问题的原因已经确定(见接受的答案)。近 8 年后,我认为所有其他明显的解释,无论是否适用,都已发布。如果您不这么认为,请在添加之前完整阅读问题和现有答案。

我在 64 位 Windows 7 Professional 上使用 Windows PowerShell 2.0。我的 Desktop 上有一个脚本,当我尝试运行它时会导致以下错误:

File C:\Users\UserName\Desktop\Script.ps1 cannot be loaded. The file C:\Users\UserName\Desktop\Script.ps1 is not digitally signed. The script will not execute on the system.  Please see "get-help about_signing" for more details..
At line:1 char:54
+ C:\Users\UserName\Desktop\TestGetWindowsUpdateLog.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

我既是域管理员又是本地管理员,如果我运行 Get-ExecutionPolicy -List,我可以看到我为配置 PowerShell 而创建的 Group Policy Object 正在机器级别正确应用 RemoteSigned 执行策略:

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy    RemoteSigned
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

我自己在 Notepad 中创建了脚本,并使用 Sysinternalsstreams 实用程序和文件 Properties 对话框来确认脚本没有被视为来自 Internet。如果我将脚本复制到域服务器上的网络共享,则允许执行。如果我运行 Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine,则仍然不允许执行本地脚本,这是有道理的,因为 MachinePolicy 范围内的执行策略将优先。

about_Execution_Policies(current; at time of question) 所述,RemoteSigned 政策意味着:

脚本可以运行。对于从 Internet 下载的脚本和配置文件(包括电子邮件和即时消息程序),需要来自受信任的发布者的数字签名。不需要对您已运行且已在本地计算机上编写的脚本(不是从 Internet 下载)进行数字签名。运行来自 Internet 以外来源的未签名脚本和已签名但恶意脚本的风险。

我的脚本没有签名,但由于它是在本地创建和执行的,它应该满足上面的第三个要点。所以...

为什么不允许我的脚本运行?

为什么 PowerShell 抱怨我的脚本“没有经过数字签名”,而该要求只适用于来自 Internet 的文件?

为什么 PowerShell 从网络共享运行时不再关心脚本未签名?

@Downvoter:愿意给出一个理由吗?

A
Andy Arismendi

需要检查的一些事项:

可以改成无限制吗?

Set-ExecutionPolicy Unrestricted

是否设置了组策略?

计算机配置\管理模板\Windows 组件\Windows PowerShell

用户配置\管理模板\Windows 组件\Windows PowerShell

另外,您如何调用 Script.ps1?

这是否允许它运行?

powershell.exe -executionpolicy bypass -file .\Script.ps1

Scope 参数的默认值为 LocalMachine,因此 Set-ExecutionPolicy Unrestricted 实际上与我已经尝试过的 Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine 相同。是的,为 Computer Configuration 启用了 Turn on Script Execution 策略。 PowerShell 打开到 C:\Users\UserName,所以我只是在提示符处运行 .\Desktop\Script.ps1。使用绝对路径会产生相同的错误,就像通过 powershell.exe 调用脚本一样。
您是否尝试过禁用组策略设置并使用 gpupdate /force 刷新? (之后重新启动 PowerShell.exe)
好吧,很长一段时间我在 LocalMachine 范围内作为 Unrestricted 运行,但是当我开始编写脚本时,我想从其他计算机运行我将 LocalMachine 设置回 Undefined 并将当前组策略添加到在 MachinePolicy 范围内设置 RemoteSigned。这只是一个一次性的测试脚本,从网络上运行它真的没什么大不了的,我只是想知道为什么它在本地不起作用。毕竟,本地创建的脚本应该允许在 RemoteSigned 下执行,对吧?我只是认为一定有一些我遗漏或不理解的东西。
@BACON 你是正确的RemoteSigned用记事本保存Write-Host hi到你的桌面应该可以正常运行。您的配置看起来也不错...对我来说似乎有些问题...这就是为什么我建议删除组策略以查看它是否有帮助。
对于开发,我们只是使用 -executionpolicy bypass 来暂时解决远程签名问题......这让我们发现 &调试其他问题(不相关,需要我们升级 PowerShell)。
O
O-Dogg

文件是否被阻止?我遇到了同样的问题,可以通过右键单击 .PS1 文件、属性并选择取消阻止来解决它。


正如我所解释的,脚本是直接在我的硬盘上创建的(不是从任何地方下载的),并且我确认没有替代流将其识别为来自不同的区域(如 Internet Explorer 和其他 Web 浏览器创建)。如果我运行 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;,我仍然会收到脚本未进行数字签名且未执行的错误。如果我为新创建的文件打开“属性”对话框,则没有什么可以取消阻止的。
你是什么意思〜“属性和选择取消阻止”?
@IgorGanapolsky 他们的意思是在资源管理器中,找到 ps1 文件右键单击它以调出上下文菜单并选择 Properties,在靠近底部的第一个选项卡上,它会说文件被阻止并允许您勾选复选框以取消阻止它。
请注意,如果您下载了 zip 文件,则应在解压缩该 zip 文件之前对其进行解锁,以避免大量解锁其中的所有文件。
@Lankymart Windows 10,试过这个,并没有说它被阻止。
G
GeekMustHave

我在为 Dropbox 的映射驱动器运行 PS1 文件时发现,我总是收到此错误。打开 PS1 的属性时,没有“解锁”。

唯一对我有用的是

powershell.exe -executionpolicy bypass -file .\Script.ps1


您是说您的脚本存储在映射到网络共享的驱动器上?或者脚本创建一个映射驱动器?如果前者,正如它在问题的正文和标题中所述,脚本是在本地创建和存储的,所以脚本的来源/区域不会是一个因素。无论哪种方式,已经建议使用 Bypass 执行策略 over five years ago 并且最近是 five months ago。请在回答之前阅读问题和现有答案。
G
Gautam Sharma

当您运行 .ps1 PowerShell 脚本时,您可能会收到“.ps1 未进行数字签名”的消息。该脚本不会在系统上执行。”要修复它,您必须运行以下命令来运行 Set-ExecutionPolicy 并更改执行策略设置。

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

另一个答案已经建议使用 Bypass 执行策略。无论如何,使用不同的策略是没有帮助的,并且如果确实需要 RemoteSigned,它并不能解决实际问题。最后,您引用的错误消息与问题中的错误消息不同。
此外,此命令仅适用于当前会话
L
Lance U. Matthews

我终于找到了.NET Code Access Security。我有一些内部开发的二进制模块,它们存储在网络共享上并从网络共享中执行。为了让 .NET 2.0/PowerShell 2.0 加载它们,我已将 URL 规则添加到 Intranet 代码组以信任该目录:

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -listgroups
Microsoft (R) .NET Framework CasPol 2.0.50727.5420
Copyright (c) Microsoft Corporation.  All rights reserved.

Security is ON
Execution checking is ON
Policy change prompt is ON

Level = Machine

Code Groups:

1.  All code: Nothing
    1.1.  Zone - MyComputer: FullTrust
        1.1.1.  StrongName - ...: FullTrust
        1.1.2.  StrongName - ...: FullTrust
    1.2.  Zone - Intranet: LocalIntranet
        1.2.1.  All code: Same site Web
        1.2.2.  All code: Same directory FileIO - 'Read, PathDiscovery'
        1.2.3.  Url - file://Server/Share/Directory/WindowsPowerShell/Modules/*: FullTrust
    1.3.  Zone - Internet: Internet
        1.3.1.  All code: Same site Web
    1.4.  Zone - Untrusted: Nothing
    1.5.  Zone - Trusted: Internet
        1.5.1.  All code: Same site Web

请注意,根据安装的 .NET 版本以及是 32 位还是 64 位 Windows,caspol.exe 可以存在于以下位置,每个位置都有自己的安全配置 (security.config):

$Env:SystemRoot\Microsoft.NET\Framework\v2.0.50727\

$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\

$Env:SystemRoot\Microsoft.NET\Framework\v4.0.30319\

$Env:SystemRoot\Microsoft.NET\Framework64\v4.0.30319\

删除组 1.2.3. 后...

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -remgroup 1.2.3.
Microsoft (R) .NET Framework CasPol 2.0.50727.9136
Copyright (c) Microsoft Corporation.  All rights reserved.

The operation you are performing will alter security policy.
Are you sure you want to perform this operation? (yes/no)
yes
Removed code group from the Machine level.
Success

...我留下了默认的 CAS 配置,并且本地脚本现在可以再次工作。自从我修改 CAS 以来已经有一段时间了,我不确定为什么我的规则似乎会干扰那些将 FullTrust 授予 MyComputer 的人,但是自从 CAS is deprecated as of .NET 4.0(PowerShell 3.0 所基于)以来,我想现在这是一个有争议的问题。


您是如何添加 URL 规则的?我有同样的问题,希望这可以帮助我解决它。谢谢。
自从我使用 caspol.exe 已经很长时间了,但是在运行 caspol.exe -machine -addgroup 1.2 -url file://Server/Share/Directory/WindowsPowerShell/Modules/* FullTrust 之后,我最终得到了与此答案中相同的 1.2.3. 规则。我使用 file:// URL 来引用 SMB 共享上的目录,但我在文档中看到 -addgroup examples 之一使用 UNC 路径。
我的 4 个 caspol.exe 中的任何一个上都没有这个互联网的东西,所以这不是解决方案
@Charkel您遇到什么问题?问题中描述的相同错误消息?这解决了我遇到的奇怪和意外的行为,这就是我将其标记为解决方案的原因。
P
Peter Mortensen

如果文件是从网络位置(即另一台计算机)复制的,Windows 可能已阻止该文件。右键单击该文件,然后单击取消阻止按钮,看看它是否有效。


正如我在问题和我对@O-Dogg 答案的评论中所解释的那样,该脚本是直接在我的硬盘驱动器上创建的(不是从任何地方下载的),并且我确认没有替代流将其识别为来自不同的区域(就像 Internet Explorer 和其他网络浏览器创建的一样)。如果我运行 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;,我仍然会收到脚本未进行数字签名且未执行的错误。如果我为新创建的文件打开“属性”对话框,则没有什么可以取消阻止的。
值得检查您没有在映射驱动器上创建和运行它。例如,在我们的服务器上,每个用户的主文件夹是其个人文件夹的映射驱动器。
l
leonidaa

此代码行在 Ubuntu 中使用 virtualbox 和 Win 10 作为虚拟操作系统,在 powershell 内

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

如果它不起作用,我建议阅读以下资源:

设置执行策略

模块:Microsoft.PowerShell.Security 为 Windows 计算机设置 PowerShell 执行策略。

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-7.1#:~:text=To%20change%20the%20execution%20policy,Get%2DExecutionPolicy%20with%20no%20parameters

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-executionpolicy?view=powershell-7.1

Get-ExecutionPolicy -List

https://devblogs.microsoft.com/scripting/hey-scripting-guy-how-can-i-sign-windows-powershell-scripts-with-an-enterprise-windows-pki-part-2-of-2/


我可以问一个诚实的问题吗?您是否阅读过问题或其他答案?我不明白为什么我的问题已成为与执行政策有关的一切的垃圾场。它非常清楚地表明,更改为 RemoteSigned 不是解决方案,因为它已经是这样了!已经有很多其他答案暗示了同样的非解决方案。
M
Mo Zaatar

对我有用的是右键单击 .ps1 文件,然后单击属性。单击“解除锁定”按钮。在花了几个小时试图改变政策后,我觉得效果很好。


已经有两个答案忽略了问题中的陈述,并提出了同样不适用的解决方案。我写得很清楚“我......使用 Sysinternals 的流实用程序和文件属性对话框来确认脚本没有被视为来自 Internet”,然后“它是在本地创建和执行的”。它甚至在标题中说该脚本是“本地创建的”。没有什么可以解锁的。如果解除阻止您的脚本解决了您的问题,那么您没有遇到与我相同的问题,因为如上所述,我的脚本没有被阻止。 -1。
@BACON 公平地说,我有和你一样的症状,对我来说,解锁工作。即使我的脚本是在本地创建的,我每次保存后都必须取消阻止它。
这可能是一种解决方法,但不是完全正确的解决方案
@SQB 只是好奇,你有漫游配置文件吗?
p
pranav aggarwal

选择您的终端命令提示符而不是 Power shell。那应该行得通。


这甚至意味着什么?在哪里选择?目标是在 PowerShell 中运行 PowerShell 脚本,因此使用 PowerShell 以外的任何东西都行不通。
我在尝试运行 AWS Amplify CLI 时遇到了同样的错误。从 WIndows 终端而不是 PowerShell 运行放大命令似乎可以使它工作。
这行得通。不确定它是否会被认为是可接受的答案,我还不能说它为什么有效,但它确实有效。
P
Peter Mortensen

这是一个 IDE 问题。更改 PowerShell GUI 中的设置。转到工具选项卡并选择选项,然后选择调试选项。然后选中复选框关闭要签名的脚本的要求。完毕。


OP 显然不希望脚本在未签名的情况下运行,并且没有参考 IDE。
在 Powershell ISE 中不可用
M
Mustafa Tawfig

请备份 script.bs1 文件

对我有用的是删除 script.bs1 文件并运行执行命令。


通过这样做解决了您收到的错误消息是什么?
我已经两次经历了这个错误,并以同样的方式修复它。看起来从 CMD 运行执行命令将立即在另一个具有相同名称但扩展名为 (.cmd) 的文件上运行。
文件 C:\Users\UserName\Desktop\Script.ps1 无法加载。文件 C:\Users\UserName\Desktop\Script.ps1 未进行数字签名。该脚本不会在系统上执行。 (((Script.ps1 未进行数字签名错误))
我懂了。运行 Get-ExecutionPolicy -List 时返回什么?
MachinePolicy AllSigned, UserPolicy Undefined, Process Undefined, CurrentUser RemoteSigned, LocalMachine Bypass
S
Sumith Ekanayake

这是因为 Powershell 执行策略默认设置为受限,这会阻止执行 PowerShell 脚本并防止运行恶意脚本。

您可以通过运行以下命令来更改特定范围的执行范围

Set-ExecutionPolicy -Scope Process 

它在问题的标题中说正在使用的执行策略是 RemoteSigned
P
Peter Mortensen

我遇到了同样的问题,并通过将默认程序更改为将 .ps1 文件打开到 PowerShell 来修复它。它设置为 Notepad


你有同样的问题吗?或者当您双击 .ps1 文件时,它会在记事本中打开,而不是在 PowerShell 中执行脚本?
P
Pauline

尝试以管理员身份运行 Powershell GUI


如问题所述,I am both a domain administrator and a local administrator。运行提升的 PowerShell 不会产生影响,因为当脚本存储在网络共享上时,允许运行不提升的脚本。
R
Rakesh Dongarwar

在 PowerShell 窗口中运行以下 2 个命令

Set-ExecutionPolicy unrestricted Unblock-File -Path D:\PowerShell\Script.ps1


显然,您没有阅读该问题或其他多年前提出的相同不适用解决方案的变体的回复,或者我的评论一次又一次地指出这不是答案。如果可以的话,我会-10,但相反,我将不得不接受-1。