2012-03-16 54 views
22

我在64位Windows 7 Professional上使用Windows PowerShell 2.0。我有我的桌面上的一个脚本,将导致以下错误,当我尝试运行它:为什么我的本地创建的脚本不允许在RemoteSigned执行策略下运行?

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以外的来源和已签名的恶意脚本。

我的脚本没有签名,但既然它是在本地创建和执行的,它应该满足上面的第三个要点。那为什么它不被允许运行?为什么PowerShell会抱怨我的脚本“未经过数字签名”,而这个要求只适用于来自Internet的文件?为什么它不再关心脚本从网络共享运行时未被签名?

+0

@Downvoter:关心给个理由? – BACON 2017-03-28 20:13:30

回答

4

我终于追踪到.NET Code Access Security。我有一些内部开发的二进制模块存储在网络共享中并从中执行。要获得.NET 2.0/2.0的PowerShell加载它们,我已经添加了一个URL规则的Intranet码组相信,目录:

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进行了修改已经有一段时间了,我不知道为什么我的规则似乎会干扰那些授予FullTrustMyComputer的授权,但是自从CAS is deprecated as of .NET 4.0(基于PowerShell 3.0的版本),我想这是一个争议点现在。

28

有些事情要检查:

您可以更改为无限制吗?

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 
+0

'Scope'参数的默认值是'LocalMachine',所以'Set-ExecutionPolicy Unrestricted'与我已经尝试过的'Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine'实际上是一样的。是的,为“计算机配置”启用了“启用脚本执行”策略。 'PowerShell'打开'C:\用户\ UserName',所以我只是用'\桌面\ Script.ps1'在提示符下。使用绝对路径会产生相同的错误,就像通过'powershell.exe'调用脚本一样。 – BACON 2012-03-16 19:08:34

+0

您是否尝试禁用组策略设置并使用'gpupdate/force'刷新? (重新开张后PowerShell.exe) – 2012-03-16 19:25:21

+0

嗯,很长一段时间我是在'LocalMachine'范围运行的'Unrestricted',但是当我开始写剧本,我想从我设置其他计算机上运行'LocalMachine'回到'未定义'并添加了当前的组策略以在'MachinePolicy'范围内设置'RemoteSigned'。这只是一次性的测试脚本,从网络上运行它真的没什么大不了的,我只想知道*为什么它在本地不起作用。毕竟,一个本地创建的脚本应该允许在'RemoteSigned'下执行,对吧?我只是觉得必须有一些我失踪或不理解的东西。 – BACON 2012-03-16 19:47:11

56

该文件被阻止?我遇到了同样的问题,可以通过右键单击.PS1文件,属性并选择解除阻止来解决问题。

+0

正如我所解释的,该脚本直接在我的硬盘驱动器上创建(并非从任何地方下载),并且我确认没有其他流将其识别为源自不同区域(如Internet Explorer和其他Web浏览器创建的)。如果我运行'Write-Host''Hello,World!'';' >。\ Test.ps1; 。\ Test.ps1;'我仍然收到脚本没有进行数字签名并且未执行的错误。如果我为新创建的文件打开属性对话框,则没有任何可以解除阻止的内容。 – BACON 2013-02-08 17:25:48

+0

++这解决了我的问题。我想知道为什么Windows保持阻止文件?这是可以切换的东西吗? – Seiyria 2013-07-29 20:05:51

+10

你是什么意思〜“**属性和选择解锁**”? – 2016-07-04 22:55:32

3

如果文件是从网络位置(即另一台计算机)复制的,则Windows可能会阻止该文件。右键单击该文件,然后单击解除阻止按钮并查看它是否有效。

+2

正如我在@ O-Dogg的回答中对问题和我的评论所解释的那样,该脚本直接在我的硬盘驱动器上创建(未从任何地方下载),并且我确认没有其他流将其标识为源自不同的区域(如Internet Explorer和其他Web浏览器创建)。如果我跑了''Write-Host''Hello,World!'';'' >。\ Test.ps1; 。\ Test.ps1;'我仍然得到脚本没有数字签名并且没有执行的错误。如果我打开新建文件的属性对话框,则没有任何可以解除阻止的内容。 – BACON 2013-05-24 14:35:08

2

这是一个IDE问题。更改PowerShell GUI中的设置。转到工具选项卡并选择选项,然后调试选项。然后选中复选框关闭要签署的脚本。完成。

0

我遇到了同样的问题,并通过更改默认程序将.ps1文件打开到PowerShell来修复它。它被设置为Notepad。在名为.ps1文件,然后属性

+0

你确实有这个相同的问题?或者当你双击一个'.ps1'文件时,它会在记事本中打开,而不是在PowerShell中执行脚本? – BACON 2014-08-07 19:30:58

+0

是的,这有效。但这不是一个非常安全的做法。 – 2015-01-10 00:31:02

0

尝试运行PowerShell的GUI为管理员

+2

正如问题所述,“我既是域管理员又是本地管理员”。提升运行PowerShell不会产生任何影响,因为脚本被允许在网络共享中存储时运行未升级。 – BACON 2016-05-25 18:08:35

-2

什么工作对我来说是单击鼠标右键。点击“UNBLOCK”按钮。在花费数小时试图改变政策之后,我工作得非常好。

+0

已经有两个答案忽略了问题中陈述的内容,并提出了相同的不适用解决方案。我写得非常清楚:“我使用了Sysinternals的流工具和文件属性对话框来确认脚本不被视为来自Internet”,然后“它既在本地创建又在本地执行”。它甚至在标题中说这个脚本是“本地创建的”。没有任何东西可以解锁。如果解锁你的脚本解决了你的问题,那么你没有遇到同样的问题,因为如前所述,我的脚本没有被阻止。 -1。 – BACON 2016-11-16 01:20:11

相关问题