由于此问题继续吸引被问题主体反驳或未解决实际问题的答案,因此 请阅读以下有关需要了解的简单摘要:
- 这不是“为什么默认安装的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
,我可以看到Group Policy Object
我创建的用于配置PowerShell的代码正确地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以外的其他来源的未经签名的脚本和经过签名但恶意的脚本的风险。
我的脚本没有签名,但是由于它是在本地创建和执行的,因此应该满足上面的第三个要点。因此...
- 为什么不允许我的脚本运行?
- 当该要求仅适用于Internet上的文件时,为什么PowerShell会抱怨我的脚本“未进行数字签名”?
- 为什么从网络共享运行脚本时,PowerShell不再关心脚本未签名?