我在64位Windows 7 Professional上使用Windows PowerShell 2.0。我的桌面上有一个脚本,当我尝试运行它时会导致以下错误:
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
对话框来确认脚本不被视为来自Internet。如果我将脚本复制到域服务器上的网络共享,则允许执行。如果我运行Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine
,那么仍然不允许执行本地脚本,这是有道理的,因为MachinePolicy
范围的执行策略将优先。
正如about_Execution_Policies
所记录的那样,RemoteSigned
政策意味着:
我的脚本没有签名,但由于它是在本地创建和执行的,因此它应满足上面的第三个要点。那么为什么它不被允许运行?为什么当该要求仅适用于来自Internet的文件时,PowerShell会抱怨我的脚本“未经过数字签名”?为什么它不再关心脚本在从网络共享运行时没有被签名?
文件被阻止了吗?我有同样的问题,可以通过右键单击.PS1文件,属性并选择取消阻止来解决它。
在PowerShell窗口中运行以下2个命令
有些事要检查:
你可以改为不受限制吗?
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
我终于跟踪到了.NET Code Access Security。我有一些内部开发的二进制模块,存储在网络共享上并从网络共享中执行。为了让.NET 2.0 / PowerShell 2.0加载它们,我在Intranet
代码组中添加了一个URL规则来信任该目录:
PS C:\Users\UserName> & "$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
(让我使用CAS的默认配置)后,本地脚本现在可以再次运行。我已经用CAS修改了一段时间,而且我不确定为什么我的规则似乎会干扰那些给FullTrust
授予MyComputer
的规则,但是自从CAS is deprecated as of .NET 4.0(基于PowerShell 3.0的基础),我想这是一个没有实际意义的点。现在。
如果文件是从网络位置(即另一台计算机)复制的,则Windows可能已阻止该文件。右键单击该文件,然后单击取消阻止按钮,看它是否有效。
这是一个IDE问题。更改PowerShell GUI中的设置。转到“工具”选项卡,选择“选项”,然后选择“调试选项”。然后选中“关闭要签名脚本的要求”框。完成。
尝试以管理员身份运行Powershell GUI
对我有用的是右键单击.ps1文件,然后右键单击属性。单击“UNBLOCK”按钮。在花费数小时试图改变政策后,我的工作很棒。
我发现在为Dropbox运行映射驱动器的PS1文件时,我总是收到此错误。打开PS1的属性时,没有“取消阻止”。
唯一对我有用的是
powershell.exe -executionpolicy bypass -file。\ Script.ps1
我遇到了同样的问题并通过更改默认程序将.ps1文件打开到PowerShell来修复它。它被设置为Notepad。