我在运行PowerShell脚本时遇到错误:
无法加载文件test_new.ps1。文件test_new.ps1未经过数字签名。
我创建了一个CA和一个证书,并使用here描述的过程对该文件进行了签名。
下面是我在MY
目录上执行dir
的情况:
EF76B3D7D8D2406E1F2EE60CC40644B122267F18 CN=PowerShell User
我可以看到附加在test_new.ps1
文件末尾的签名块。
执行方针和范围如下:
Scope ExecutionPolicy
----- ---------------
MachinePolicy AllSigned
UserPolicy Undefined
Process Bypass
CurrentUser AllSigned
LocalMachine Undefined
machinepolicy应该优先,设置为AllSigned
。一切似乎都很好,为什么我仍然得到数字签名的错误。
6条答案
按热度按时间2skhul331#
Powershell执行策略设置为Allsigned时,仅运行由受信任的发布者签名的脚本。您可以在下面找到-ExecutionPolicy参数的可能值:
受限:不加载配置文件或运行脚本的默认设置。
所有签名:要求所有脚本和配置文件(包括您在本地计算机上编写的脚本)都由受信任的发布者签名。
远程签名:要求从Internet下载的所有脚本和配置文件都由受信任的远程发布者签名。
无限制:加载所有配置文件并运行所有脚本。如果运行从Internet下载的未签名脚本,则在运行脚本之前会提示您是否具有权限。
绕过:不阻止任何内容,也没有警告或提示。
未定义:从当前作用域中删除当前分配的执行策略,将会话返回到默认值。此参数不会删除在Active Directory组策略中设置的执行策略。
您可以通过以下命令设置PowerShell执行策略:
设置执行策略不受限制
如果要在域网络上运行脚本,则可能需要使用组策略来确保用于对脚本进行签名的代码签名证书是域中受信任的发行者。为此,需要执行两个步骤:
1.导出代码签名证书。
1.创建策略并将代码签名证书导入受信任的发布者。
在域网络中更新策略后,受信任的发布者证书应列在证书管理单元下的“受信任的发布者”中。
sqxo8psd2#
终于找到了解决这个问题的办法:
它必须在
TrustedPublisher
商店中发布才能工作。puruo6ea3#
这显然与PowerShell的策略有关,有了3个选项,它可以更改此错误的传递策略以及此错误的所有相同类型。
1设置-执行策略绕过-作用域当前用户-强制
2设置-执行策略远程签名-作用域当前用户-强制。(推荐)
3 Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force. (不推荐,因为您的计算机环境在抵御恶意软件或任何有害软件方面会变得薄弱...)
00jrzges4#
一种可能的方法是完全绕过安全性,并像这样启动脚本(要绕过强制的GPO,请参阅本文底部):
在Windows 2003域和受限powershell上测试。
启动powershell并启用旁路,然后执行脚本:
在未打开旁路的情况下启动powershell并执行脚本:
系统信息:
引用评论:
... OP具有使用组策略(作用域MachinePolicy和/或UserPolicy)强制实施的执行策略。不能绕过...'
由位于注册表配置单元的组策略对象推送的
ExecutionPolicy
项:HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell
.当你将值从any更改为Possible values for execution policies)到
bypass
时,可以看到更多的内容。然后你就可以绕过强加的GPO
。我相信还有其他的方法可以做到这一点。更多的想法,你可以查看好的resource。我相信更有创造力的人可以找到一些其他的方法来绕过GPO。也就是说,对于永久的解决方案,重复使用更好。据推测,使用密钥可能更安全,即使你也将取决于其他因素。
我终于找到了一些时间来探索各种可能性。对于
Windows 2003
,不可能通过编辑组策略gpedit.msc
来更改本地策略,必须在域级别上完成(MS不支持Windows 2003,目前是EOL
)在
Windows 2008
上,情况就不同了。如果更改本地策略,则可以轻松地将策略更改为AllSigned,如下所示:
如果您随后通过上述参数执行脚本:
-NoProfile -ExecutionPolicy Bypass
,您将收到以下消息,因此您的GPO策略要求对脚本进行签名:您还可以检查注册表设置以确保(也将显示您希望在运行脚本后返回的值):
如果您具有正确的权限,则可以通过以下方式轻松绕过此问题(这会将ExecutionPolicy设置为"bypass"):
然后,如果您检查执行策略,您会发现确实有一个更改:
PS C:\Windows\系统32〉获取执行策略列表
如果您随后运行该脚本,它将正常运行。
完成后,您可以通过以下方式返回以前的值:
我想说得很清楚,所以我加上了结论,因为下面的评论可能会导致错误的假设。
这是参数
'-NoProfile -ExecutionPolicy Bypass
将使用的最大安全性:MachinePolicy
被设置为AllSigned
时,你需要一些方法来解决这个问题,或者有一个签名的密钥。最佳的解决方案是使用密钥。如果你因为某些原因不能使用密钥,你可以使用上面的步骤来改变注册表中的值,或者尝试上面已经链接的15 ways to bypass the powershell execution policy中的一个。bwleehnv5#
要修复此问题,您必须运行以下命令以运行Set-ExecutionPolicy并更改执行策略设置。
设置-执行策略-作用域进程-执行策略绕过
0ve6wy6x6#
我尝试了所有的建议,但没有一个对我有效。这是我的解决方案,
1.选中获取执行策略列表
1.我的计算机策略是AllSigned -我需要更改此策略。
1.转到注册表编辑器:HKEY_L_M〉软件〉策略〉微软〉WINDOWS〉powershell:执行策略将数据更改为“绕过”。
1.运行ps1脚本以检查是否已修复。
我的机器在更新到Windows 11之前没有问题。我仍然不确定是什么原因导致了这个问题。