【问题标题】:Why is my locally-created script not allowed to run under the RemoteSigned execution policy?为什么我的本地创建的脚本不允许在 RemoteSigned 执行策略下运行?
【发布时间】:2012-04-02 07:42:40
【问题描述】:

由于此问题继续吸引以下回复,要么 被问题主体驳斥或不解决实际问题, 请阅读此简单摘要,了解您需要了解的内容:

  • 不是“为什么我的 PowerShell 的默认安装不运行脚本?”问题。
  • 不是“为什么我安装的 PowerShell 不能运行从 Internet 下载的脚本?”问题。
  • 问题是为什么RemoteSigned 执行策略在不应该阻止脚本执行的情况下阻止脚本执行。
  • RemoteSigned 是我想要使用的唯一执行策略。我知道还有其他限制较少的策略可用。如果 这些政策是可以接受的替代品,我会使用它们 相反,这个问题就不存在了。
  • 执行策略已经设置为 RemoteSigned 将其从 RemoteSigned 更改为 RemoteSigned 不是解决方案。
  • 脚本文件在本地创建和存储。
  • 脚本文件未被阻止。脚本文件从未被阻止(参见上一点)。
  • 无法解除阻止脚本文件,因为没有可解除阻止的内容(参见上一点)。
  • 脚本文件已(试图)由管理员执行。
  • Windows PowerShell 是唯一涉及的应用程序。 不是 Windows PowerShell ISECommand Prompt 或任何其他工具或 编辑是相关的。
  • 问题的原因已经确定(请参阅已接受的答案)。将近 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 中创建了脚本,并使用了Sysinternals'streams 实用程序和文件Properties 对话框来确认脚本没有被视为来自互联网。如果我将脚本复制到域服务器上的网络共享,则允许执行。如果我运行Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine,则仍然不允许执行本地脚本,这是有道理的,因为MachinePolicy 范围内的执行策略将优先。

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

  • 脚本可以运行。

  • 从 Internet 下载的脚本和配置文件需要来自受信任的发布者的数字签名 (包括电子邮件和即时通讯程序)。

  • 不需要对已运行且已在本地计算机上编写的脚本进行数字签名(不是从 互联网)。

  • 运行来自 Internet 以外来源的未签名脚本和已签名但恶意脚本的风险。

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

  • 为什么不允许我的脚本运行?
  • 为什么 PowerShell 抱怨我的脚本“没有经过数字签名”,而该要求只适用于来自 Internet 的文件?
  • 为什么 PowerShell 从网络共享运行时不再关心脚本未签名?

【问题讨论】:

  • @Downvoter:愿意给出原因吗?

标签: powershell powershell-2.0 code-signing executionpolicy


【解决方案1】:

需要检查的一些事项:

可以改成无限制吗?

Set-ExecutionPolicy Unrestricted

组策略设置了吗?

  • Computer Configuration\Administrative Templates\Windows Components\Windows PowerShell
  • User Configuration\Administrative Templates\Windows Components\Windows PowerShell

另外,你是怎么调用 Script.ps1 的?

这是否允许它运行?

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

【讨论】:

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

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

【讨论】:

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

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

唯一对我有用的是

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

【讨论】:

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

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

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

【讨论】:

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

我终于找到了.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 你有什么问题?问题中描述的相同错误消息?这解决了我遇到的奇怪和意外的行为,这就是我将其标记为解决方案的原因。
【解决方案6】:

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

【讨论】:

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

此代码行在 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 不是解决方案,因为它已经是这样了!已经有很多其他答案暗示了同样的非解决方案。
【解决方案8】:

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

【讨论】:

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

选择您的终端命令提示符而不是 Power shell。应该可以的。

【讨论】:

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

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

【讨论】:

  • OP 显然不希望脚本在未签名的情况下运行,并且没有参考 IDE。
  • 在 Powershell ISE 中不可用
【解决方案11】:

请备份 script.bs1 文件

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

【讨论】:

  • 你得到的错误信息是什么,通过这样做解决了?
  • 我已经经历了 2 次不同的错误并以相同的方式修复它。看起来从 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
【解决方案12】:

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

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

Set-ExecutionPolicy -Scope Process 

【讨论】:

  • 它在问题的标题中说正在使用的执行策略是RemoteSigned
【解决方案13】:

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

【讨论】:

  • 你有同样的问题吗?或者当您双击 .ps1 文件时,它会在记事本中打开而不是在 PowerShell 中执行脚本?
【解决方案14】:

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

【讨论】:

  • 如问题中所述,I am both a domain administrator and a local administrator。运行提升的 PowerShell 不会产生影响,因为脚本在存储在网络共享上时允许不提升运行。
【解决方案15】:

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

  1. Set-ExecutionPolicy 不受限制

  2. Unblock-File -Path D:\PowerShell\Script.ps1

【讨论】:

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