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

因为这个问题继续吸引回答 被问题主体反驳或者没有解决实际问题, 请阅读以下关于你需要知道的简单摘要:

  • 这是 没有的一个“为什么我的 PowerShell 默认安装不能运行脚本?”的问题。
  • 这是 没有的一个“为什么我的 PowerShell 安装不能运行从互联网下载的脚本?”的问题。
  • 问题是为什么 RemoteSigned执行策略在不应该阻止脚本执行的时候却阻止脚本执行。
  • RemoteSigned是我想使用的 只有执行策略。我知道还有其他限制较少的政策。如果 那些政策是可以接受的替代品,我会直接使用它们 这个问题就不存在了。
  • 执行策略是 已经设置为 RemoteSigned 将其从 RemoteSigned改为 RemoteSigned不是一个解决方案。
  • 脚本文件在本地创建和存储。
  • 脚本文件没有被阻塞。 脚本文件从未被阻塞(参见前一点)。
  • 脚本文件无法解除阻塞 ,因为没有要解除阻塞的内容(参见前一点)。
  • 脚本文件由管理员执行(尝试执行)。
  • Windows PowerShell是唯一涉及的应用程序。不是 Windows PowerShell ISE也不是 Command Prompt也不是任何其他工具或 编辑是相关的。
  • 问题的原因已确定为 已经 (见已接受的答案)。将近8年过去了,我认为所有其他显而易见的事情 解释,不论是否适用,也已张贴。如 您认为不然 请阅读问题并存在 回答 完整无缺后再加你的

我在64位的 Windows 7专业版上使用 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中创建了脚本,并使用 系统内分泌streams实用程序和文件 Properties对话框来确认脚本没有被视为来自互联网。如果我将脚本复制到域服务器上的网络共享,那么就允许执行该脚本。如果我运行 Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine,那么仍然不允许执行本地脚本,这是有意义的,因为 MachinePolicy范围内的执行策略将优先执行。

正如 about_Execution_Policies(目前; 在提问的时候)所记录的,RemoteSigned政策意味着:

  • 脚本可以运行。

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

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

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

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

  • 为什么不允许我的脚本运行?
  • 为什么 PowerShell 抱怨我的脚本“没有数字签名”,而这个要求应该只适用于来自 Internet 的文件?
  • 为什么 PowerShell 不再关心从网络共享运行的脚本没有被签名?
321029 次浏览

有些事情需要检查:

你能换成无限制的吗?

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

文件被屏蔽了吗?我遇到了同样的问题,可以通过右键单击。PS1文件,属性和选择 Unblock。

我终于找到了 .NET 代码访问安全性。我有一些内部开发的二进制模块,它们存储在网络共享上并通过网络共享执行。为了得到。NET 2.0/PowerShell 2.0来加载它们,我在 Intranet代码组中添加了一个 URL 规则来信任该目录:

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

请注意,这取决于。无论是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的规则,但是自从 从.NET 4.0开始,不推荐使用 CAS(PowerShell 3.0的基础)以来,我想它现在是一个没有实际意义的问题。

如果文件是从网络位置(即另一台计算机)复制的,则 Windows 可能已阻止该文件。右键单击文件并单击解除阻塞按钮,看看它是否工作。

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

我也有同样的问题,所以我修改了默认程序来打开它。Ps1文件到 PowerShell。设置为 记事本

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

对我有用的是右键单击。Ps1文件,然后是属性。点击“取消阻塞”按钮。在花了几个小时试图改变政策之后,我觉得很有效。

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

  1. 不受限制地设置执行策略

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

我发现当运行一个 PS1文件的映射驱动器到 Dropbox,我总是得到这个错误。当为 PS1打开属性时,没有“解除阻塞”。

对我唯一有用的就是

Exe-Executtionpolicy 旁路-file. Script.ps1

选择您的终端命令提示符而不是 Powershell。这应该可以工作。

请为 script.bs1文件做一个备份

对我来说,有效的方法是删除 script.bs1文件并运行 Execution 命令。

当你运行一个。Ps1 PowerShell 脚本您可能会得到这样的消息: “。Ps1没有数字签名。这个脚本不会在系统上执行。” 要修复它,您必须运行下面的命令来运行 Set-ExectionPolicy 并更改 Execution Policy 设置。

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

这个代码行在 Ubuntu 中运行,在 powershell 内部使用 Virtual box 和 Win 10作为虚拟操作系统

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

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

Set-ExectionPolicy

单元: 微软,PowerShell,安全 设置 Windows 计算机的 PowerShell 执行策略。

Https://learn.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://learn.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/

这是由于 PowerShell 的执行策略默认设置为限制执行 PowerShell 脚本,并防止运行恶意脚本。

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

Set-ExecutionPolicy -Scope Process