为什么不允许我在本地创建的脚本在RemoteSigned执行策略下运行?


98

由于此问题继续吸引被问题主体反驳或未解决实际问题的答案,因此 请阅读以下有关需要了解的简单摘要

  • 不是“为什么默认安装的PowerShell运行脚本为什么不显示?” 题。
  • 不是“为什么我的安装PowerShell不能从Internet下载的运行脚本?” 题。
  • 问题是为什么RemoteSigned执行策略在不应该执行时阻止脚本执行。
  • RemoteSigned是我要使用的唯一执行策略。 我知道可以使用其他限制较少的策略。如果这些政策是可以接受的替代方案,我将只使用它们,而这个问题将不复存在。
  • 执行策略设置为RemoteSigned 从改变它RemoteSignedRemoteSigned是没办法了。
  • 脚本文件已创建并存储在本地。
  • 脚本文件未被阻止。 脚本文件从未被阻止(请参阅上一点)。
  • 无法取消阻止脚本文件,因为没有任何要取消阻止的内容(请参见上一点)。
  • 脚本文件由管理员执行(试图执行)。
  • 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,并使用Sysinternalsstreams实用程序和文件Properties对话框来确认该脚本未被视为来自互联网。如果我将脚本复制到域服务器上的网络共享,则可以执行该脚本。如果我运行,Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine则仍然不允许执行本地脚本,这是有道理的,因为MachinePolicy范围内的执行策略将具有优先权。

about_Execution_Policies当前在提出问题时)所记录,该RemoteSigned政策表示:

  • 脚本可以运行。

  • 需要从Internet上下载的脚本和配置文件(包括电子邮件和即时消息传递程序)上的可信任发布者提供数字签名。

  • 在运行的脚本以及在本地计算机上编写的脚本(不是从Internet下载的)上不需要数字签名。

  • 可能会运行来自Internet以外的其他来源的未经签名的脚本和经过签名但恶意的脚本的风险。

我的脚本没有签名,但是由于它是在本地创建和执行的,因此应该满足上面的第三个要点。因此...

  • 为什么不允许我的脚本运行?
  • 当该要求仅适用于Internet上的文件时,为什么PowerShell会抱怨我的脚本“未进行数字签名”?
  • 为什么从网络共享运行脚本时,PowerShell不再关心脚本未签名?

1
@Downvoter:为什么要给出原因?
培根

Answers:


125

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


1
正如我所解释的,该脚本是直接在我的硬盘驱动器上创建的(不是从任何地方下载的),并且我确认没有替代流将其标识为来自其他区域(例如Internet Explorer和其他Web浏览器创建)。如果我运行'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;,仍然会收到以下错误消息:脚本未进行数字签名并且未执行。如果我打开新创建文件的“属性”对话框,则没有任何要取消阻止的内容。
培根

48
您是什么意思〜“属性,然后选择解除阻止”?
IgorGanapolsky '16

1
@IgorGanapolsky的意思是在资源管理器中,ps1右键单击该文件以打开上下文菜单,然后选择Properties,在底部附近的第一个选项卡上,它将说该文件已被阻止,并允许您选中一个复选框以取消阻止它。
Lankymart

1
请注意,如果您下载了一个zip文件,则应先解压缩该zip文件,然后再解压缩该文件,以避免大规模取消对其中的所有文件的阻止。
奥哈德·施耐德

14
@ Lankymart Windows 10,尝试过此操作,并不表示已被阻止。
艾伦·巴尔吉

119

要检查的一些事情:

您可以更改为无限制吗?

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

Scope参数的默认值为LocalMachine,因此Set-ExecutionPolicy Unrestricted实际上与Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine我已经尝试过的相同。是的,已Turn on Script Execution为启用了该策略Computer ConfigurationPowerShell打开C:\Users\UserName,所以我只.\Desktop\Script.ps1在提示符下运行。使用绝对路径会产生相同的错误,就像通过调用脚本一样powershell.exe
培根

您是否尝试过禁用组策略设置并使用刷新gpupdate /force?(之后重新启动PowerShell.exe)
Andy Arismendi 2012年

好吧,很长一段时间以来,我一直UnrestrictedLocalMachine范围内运行,但是当我开始编写脚本时,我想从其他计算机上运行,​​所以我LocalMachine重新Undefined设置RemoteSigned并在MachinePolicy范围内添加了当前的组策略。这只是一次测试脚本,从网络上运行它真的没什么大不了的,我只是想知道为什么它在本地不起作用。毕竟,应该允许在本地执行脚本RemoteSigned,对吧?我只是以为一定是我缺少或不了解的东西。
培根2012年

@BACON关于使用记事本RemoteSigned保存Write-Host hi到桌面的问题,您可以正确运行。您的配置看起来也没问题...似乎有些问题...这就是为什么我建议删除组策略以查看是否有帮助的原因。
安迪·阿里斯曼迪

1
为了进行开发,我们只是-executionpolicy bypass暂时解决了remotesigned问题……而这使我们可以发现并调试其他问题(不相关,这需要我们升级PowerShell)。
Doug_Ivison '18年

13

我最终将其追溯到.NET代码访问安全性。我有一些内部开发的二进制模块,它们存储在网络共享上并从网络共享中执行。为了让.NET 2.0 / PowerShell 2.0加载它们,我向Intranet代码组添加了URL规则以信任该目录:

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进行修改以来已经有一段时间了,我不确定为什么我的规则似乎会干扰那些授予的FullTrustMyComputer,但是由于.NET 4.0(基于PowerShell 3.0)不赞成使用CAS,因此我猜现在是有争议的。


您如何添加网址规则?我有同样的问题,希望这可以帮助我解决。谢谢。
OptimusPrime

自从使用以来已经很长时间了caspol.exe,但是运行之后,caspol.exe -machine -addgroup 1.2 -url file://Server/Share/Directory/WindowsPowerShell/Modules/* FullTrust我最终得到了与1.2.3.该答案相同的规则。我使用file://URL来引用SMB共享上的目录,尽管我在文档中看到其中一个-addgroup 示例使用UNC路径。
培根

11

我发现在为Dropbox的映射驱动器运行PS1文件时,总是会收到此错误。打开PS1的属性时,没有“取消阻止”。

对我唯一有用的是

powershell.exe -executionpolicy旁路-file。\ Script.ps1


1
您是说您的脚本存储在映射到网络共享的驱动器上?还是脚本创建了映射驱动器?如果前者(如其在问题的正文和标题中指出的那样)是在本地创建和存储的,那么脚本的来源/区域将不是一个因素。无论哪种方式,Bypass都已经在五年前和最近五个月前提出使用执行策略的建议。在回答之前,请先阅读问题和现有答案。
培根

6

如果从网络位置(即另一台计算机)复制文件,则Windows可能已阻止该文件。右键单击该文件,然后单击“取消阻止”按钮,看看它是否有效。


2
正如我在问题和对@ O-Dogg答案的评论中所解释的那样,该脚本是直接在我的硬盘上创建的(不是从任何地方下载的),并且我确认没有替代流将其标识为源自其他区域(例如Internet Explorer和其他网络浏览器创建的)。如果我运行'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;,仍然会收到错误消息,该脚本未进行数字签名并且未执行。如果我打开了新创建文件的“属性”对话框,则没有任何内容可以解除阻止。
培根

值得检查您没有在映射驱动器上创建和运行它。例如,在我们的服务器上,每个用户的主文件夹是一个映射到其个人文件夹的驱动器。
卡托

0

这是一个IDE问题。在PowerShell GUI中更改设置。转到“工具”标签,然后选择“选项”,然后选择“调试选项”。然后选中“关闭脚本签名要求”复选框。做完了


OP显然不希望脚本以未签名的方式运行,并且不引用IDE。
kfsone

1
在Powershell ISE中不可用
Josh Noe

0

对我有用的是右键单击.ps1文件,然后单击属性。点击“解锁”按钮。花了数小时试图更改政策后,我的工作效果很好。


1
已经有两个答案忽略了问题中提到的内容,并提出了同样的不适用解决方案。我写得很清楚:“我使用了Sysinternals的stream实用程序和文件Properties对话框来确认该脚本未被视为来自Internet”,然后“在本地创建并执行”。它甚至在标题中说该脚本是“本地创建的”。没有什么可以解除的。如果取消阻止脚本解决了您的问题,那么您就不会遇到与我相同的问题,因为如上所述,我的脚本未被阻止。-1。
培根

1
@BACON公平地说,我的症状与您相同,并且对我而言,畅通无阻。甚至以为我的脚本是在本地创建的,保存后每次都必须取消阻止它。
SQB

这可能是一个解决方法,但不是完整的正确解决方案
Mo Zaatar

0

请备份script.bs1文件

对我有用的是删除script.bs1文件并运行执行命令。


1
通过执行此操作可以解决的错误消息是什么?
培根

我已经两次经历了此错误,并以相同的方式修复它。看起来从CMD运行执行命令将立即在另一个具有相同名称但扩展名为(.cmd)的文件上运行。
简单抽象

无法加载文件C:\ Users \ UserName \ Desktop \ Script.ps1。文件C:\ Users \ UserName \ Desktop \ Script.ps1没有经过数字签名。该脚本将不会在系统上执行。(((Script.ps1未进行数字签名的错误))
简单抽象

我懂了。跑步时返回什么Get-ExecutionPolicy -List
培根

MachinePolicy AllSigned,UserPolicy未定义,进程未定义,CurrentUser RemoteSigned,LocalMachine绕过
简单抽象

-1

选择您的终端命令提示符,而不是Power Shell。那应该工作。


2
这到底是什么意思?选择在哪里?我们的目标是在PowerShell中运行PowerShell脚本,因此无法使用PowerShell以外的任何工具。
培根

-1

当您运行.ps1 PowerShell脚本时,您可能会收到消息“ .ps1没有经过数字签名。该脚本将无法在系统上执行。” 要解决此问题,您必须运行以下命令以运行Set-ExecutionPolicy并更改“执行策略”设置。

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

另一个答案已经建议使用Bypass执行策略。无论如何,使用其他策略无济于事,并且如果RemoteSigned确实需要,也无法解决实际问题。最后,您引用的错误消息与问题中的错误消息不同。
培根

-2

我遇到了同样的问题,并通过更改默认程序将.ps1文件打开到PowerShell进行了修复。它设置为记事本


您确实有同样的问题吗?还是双击.ps1文件而不是在PowerShell中执行脚本,而是在记事本中打开文件?
培根2014年

-2

尝试以管理员身份运行Powershell GUI


3
如问题中所述,I am both a domain administrator and a local administrator。运行PowerShell高权限不会有什么不同,因为当脚本存储在网络共享上时,可以不运行高权限脚本。
培根

-4

在PowerShell窗口中运行以下2条命令

  1. Set-ExecutionPolicy不受限制

  2. 解除阻止文件-路径D:\ PowerShell \ Script.ps1


2
显然,您没有读过这个问题,也没有读过其他多年的答复,这些答复都提出了对该不适用的解决方案的变体,或者我的评论一次又一次地指出这不是答案。如果可以的话,我会为此设置-10,但是相反,我将不得不选择-1。
培根
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.