由于此问题继续吸引被问题主体驳斥或未解决实际问题的回答, 请阅读以下您需要了解的简单摘要:
- 这不是“为什么我的 PowerShell 的默认安装不运行脚本?” 问题。
- 这不是“为什么我安装的 PowerShell 不能运行从 Internet 下载的脚本?” 问题。
- 问题是为什么
RemoteSigned
执行策略会在不应该执行的情况下阻止脚本执行。RemoteSigned
是我要使用的唯一执行策略。 我知道还有其他限制较少的政策可用。如果这些政策是可接受的替代品,我会直接使用它们,而这个问题将不存在。- 执行策略已设置为
RemoteSigned
。 将其更改RemoteSigned
为RemoteSigned
不是解决方案。- 脚本文件在本地创建和存储。
- 脚本文件未被阻止。 脚本文件从未被阻止(参见前一点)。
- 脚本文件不能被解除阻塞,因为没有什么可以解除阻塞(见前一点)。
- 脚本文件由管理员(试图)执行。
Windows PowerShell
是唯一涉及的应用程序。 不相关Windows PowerShell ISE
,也不Command 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
(当前;在问题时)所记录的,该RemoteSigned
政策意味着:
脚本可以运行。
对于从 Internet 下载的脚本和配置文件(包括电子邮件和即时消息程序),需要来自受信任的发布者的数字签名。
不需要对您已运行且已在本地计算机上编写的脚本(不是从 Internet 下载)进行数字签名。
运行来自 Internet 以外来源的未签名脚本和已签名但恶意脚本的风险。
我的脚本没有签名,但由于它是在本地创建和执行的,它应该满足上面的第三个要点。所以...
- 为什么不允许我的脚本运行?
- 为什么 PowerShell 抱怨我的脚本“没有经过数字签名”,而该要求只适用于来自 Internet 的文件?
- 为什么 PowerShell 从网络共享运行时不再关心脚本未签名?