由于此问题继续吸引被问题主体驳斥或未解决实际问题的回复,请阅读您需要了解的简单摘要:这不是“为什么我的默认安装 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
中创建了脚本,并使用 Sysinternals 的 streams
实用程序和文件 Properties
对话框来确认脚本没有被视为来自 Internet。如果我将脚本复制到域服务器上的网络共享,则允许执行。如果我运行 Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine
,则仍然不允许执行本地脚本,这是有道理的,因为 MachinePolicy
范围内的执行策略将优先。
如 about_Execution_Policies
(current; at time of question) 所述,RemoteSigned
政策意味着:
脚本可以运行。对于从 Internet 下载的脚本和配置文件(包括电子邮件和即时消息程序),需要来自受信任的发布者的数字签名。不需要对您已运行且已在本地计算机上编写的脚本(不是从 Internet 下载)进行数字签名。运行来自 Internet 以外来源的未签名脚本和已签名但恶意脚本的风险。
我的脚本没有签名,但由于它是在本地创建和执行的,它应该满足上面的第三个要点。所以...
为什么不允许我的脚本运行?
为什么 PowerShell 抱怨我的脚本“没有经过数字签名”,而该要求只适用于来自 Internet 的文件?
为什么 PowerShell 从网络共享运行时不再关心脚本未签名?
需要检查的一些事项:
可以改成无限制吗?
Set-ExecutionPolicy Unrestricted
是否设置了组策略?
计算机配置\管理模板\Windows 组件\Windows PowerShell
用户配置\管理模板\Windows 组件\Windows PowerShell
另外,您如何调用 Script.ps1?
这是否允许它运行?
powershell.exe -executionpolicy bypass -file .\Script.ps1
文件是否被阻止?我遇到了同样的问题,可以通过右键单击 .PS1 文件、属性并选择取消阻止来解决它。
'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;
,我仍然会收到脚本未进行数字签名且未执行的错误。如果我为新创建的文件打开“属性”对话框,则没有什么可以取消阻止的。
ps1
文件右键单击它以调出上下文菜单并选择 Properties
,在靠近底部的第一个选项卡上,它会说文件被阻止并允许您勾选复选框以取消阻止它。
我在为 Dropbox 的映射驱动器运行 PS1 文件时发现,我总是收到此错误。打开 PS1 的属性时,没有“解锁”。
唯一对我有用的是
powershell.exe -executionpolicy bypass -file .\Script.ps1
Bypass
执行策略 over five years ago 并且最近是 five months ago。请在回答之前阅读问题和现有答案。
当您运行 .ps1 PowerShell 脚本时,您可能会收到“.ps1 未进行数字签名”的消息。该脚本不会在系统上执行。”要修复它,您必须运行以下命令来运行 Set-ExecutionPolicy 并更改执行策略设置。
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
Bypass
执行策略。无论如何,使用不同的策略是没有帮助的,并且如果确实需要 RemoteSigned
,它并不能解决实际问题。最后,您引用的错误消息与问题中的错误消息不同。
我终于找到了.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 所基于)以来,我想现在这是一个有争议的问题。
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 路径。
如果文件是从网络位置(即另一台计算机)复制的,Windows 可能已阻止该文件。右键单击该文件,然后单击取消阻止按钮,看看它是否有效。
'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;
,我仍然会收到脚本未进行数字签名且未执行的错误。如果我为新创建的文件打开“属性”对话框,则没有什么可以取消阻止的。
此代码行在 Ubuntu 中使用 virtualbox 和 Win 10 作为虚拟操作系统,在 powershell 内
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
如果它不起作用,我建议阅读以下资源:
设置执行策略
模块:Microsoft.PowerShell.Security 为 Windows 计算机设置 PowerShell 执行策略。
Get-ExecutionPolicy -List
RemoteSigned
不是解决方案,因为它已经是这样了!已经有很多其他答案暗示了同样的非解决方案。
对我有用的是右键单击 .ps1 文件,然后单击属性。单击“解除锁定”按钮。在花了几个小时试图改变政策后,我觉得效果很好。
选择您的终端命令提示符而不是 Power shell。那应该行得通。
这是一个 IDE 问题。更改 PowerShell GUI 中的设置。转到工具选项卡并选择选项,然后选择调试选项。然后选中复选框关闭要签名的脚本的要求。完毕。
请备份 script.bs1 文件
对我有用的是删除 script.bs1 文件并运行执行命令。
Get-ExecutionPolicy -List
时返回什么?
这是因为 Powershell 执行策略默认设置为受限,这会阻止执行 PowerShell 脚本并防止运行恶意脚本。
您可以通过运行以下命令来更改特定范围的执行范围
Set-ExecutionPolicy -Scope Process
RemoteSigned
。
我遇到了同样的问题,并通过将默认程序更改为将 .ps1 文件打开到 PowerShell 来修复它。它设置为 Notepad。
.ps1
文件时,它会在记事本中打开,而不是在 PowerShell 中执行脚本?
尝试以管理员身份运行 Powershell GUI
I am both a domain administrator and a local administrator
。运行提升的 PowerShell 不会产生影响,因为当脚本存储在网络共享上时,允许运行不提升的脚本。
在 PowerShell 窗口中运行以下 2 个命令
Set-ExecutionPolicy unrestricted Unblock-File -Path D:\PowerShell\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
下执行,对吧?我只是认为一定有一些我遗漏或不理解的东西。RemoteSigned
用记事本保存Write-Host hi
到你的桌面应该可以正常运行。您的配置看起来也不错...对我来说似乎有些问题...这就是为什么我建议删除组策略以查看它是否有帮助。-executionpolicy bypass
来暂时解决远程签名问题......这让我们发现 &调试其他问题(不相关,需要我们升级 PowerShell)。