PowerShell说“在这个系统上禁止执行脚本”。

我试图运行一个.cmd文件,从命令提示符调用PowerShell脚本,我得到下面的错误:

Management_Install.ps1无法加载,因为在此系统上禁用了脚本的执行。

我已经运行set-executionpolicy unrestricted ,当我从PowerShell运行get-executionpolicy ,我unrestricted返回。

//从Powershell输出

PS C:\ Users \ Administrator> get-executionpolicy

无限制

//从DOS输出

C:\ Projects \ Microsoft.Practices.ESB \ Source \ Samples \ Management Portal \ Install \ Scr

ipts> powershell。\ Management_Install.ps1 1

警告:运行x86 PowerShell …

文件C:\ Projects \ Microsoft.Practices.ESB \ Source \ Samples \ Management Portal \ Install \ Scripts \ Management_Install.ps1无法加载,因为在此系统上禁用了脚本的执行。 请参阅“get-help about_signing”了解更多详情。

在线:1个字符:25

  • 。\ Management_Install.ps1 <<<< 1

    • CategoryInfo:NotSpecified:(:) [],PSSecurityException

    • FullyQualifiedErrorId:RuntimeException

C:\ Projects \ Microsoft.Practices.ESB \ Source \ Samples \ Management Portal \ Install \ Scripts>暂停

按任意键继续 。 。 。

该系统是Windows Server 2008 R2。

我究竟做错了什么?

如果您使用的是Windows Server 2008 R2,则需要有一个x64和x86版本的PowerShell,两者都必须设置其执行策略。 您是否在两台主机上都设置了执行策略?

以pipe理员身份运行,您可以通过在PowerShell窗口中input以下内容来设置执行策略:

 Set-ExecutionPolicy RemoteSigned 

有关更多信息,请参阅使用Set-ExecutionPolicy Cmdlet

您可以通过在运行PowerShell时添加-ExecutionPolicy ByPass来绕过此策略

 powershell -ExecutionPolicy ByPass -File script.ps1 

我有一个类似的问题,并指出Windows Server 2012上的默认cmd运行的是x64。

对于Windows 7Windows 8Windows Server 2008 R2Windows Server 2012 ,以pipe理员身份运行以下命令:

x86 (32位)
打开C:\Windows\SysWOW64\cmd.exe
运行命令powershell Set-ExecutionPolicy RemoteSigned

x64 (64位)
打开C:\Windows\system32\cmd.exe
运行命令powershell Set-ExecutionPolicy RemoteSigned

您可以使用检查模式

  • 在CMD中: echo %PROCESSOR_ARCHITECTURE%
  • 在Powershell中: [Environment]::Is64BitProcess

参考文献:
MSDN – Windows PowerShell执行策略
Windows – 32位和64位目录的说明

现有的答案大多解释了如何 ,但很less解释为什么 。 在你执行互联网上陌生人的代码之前,特别是禁用安全措施的代码之前,你应该明确地知道你在做什么。 所以这里有一些关于这个问题的更多细节。

从TechNet 关于执行策略页面 :

通过Windows PowerShell执行策略,可以确定Windows PowerShell加载configuration文件和运行脚本的条件。

PowerShell基础 – 执行策略和代码签名列举的好处是:

  • 执行控制 – 控制执行脚本的信任级别。
  • 命令Highjack – 防止在我的path注入命令。
  • 身份 – 脚本由我信任的开发人员创build和签署,和/或使用我信任的证书颁发机构颁发的证书签名。
  • 完整性 – 脚本不能被恶意软件或恶意用户修改。

要检查当前的执行策略,可以运行Get-ExecutionPolicy 。 但是你可能在这里,因为你想改变它。

为此,您将运行Set-ExecutionPolicy cmdlet。

更新执行策略时,您将做出两个重大决策。

执行政策types:

  • Restricted – 否系统上可以执行本地,远程或下载的脚本。
  • AllSigned – 所有运行的脚本都需要进行数字签名。
  • RemoteSigned – 所有远程脚本(UNC)或下载需要签名。
  • Unrestricted – 不需要签名任何types的脚本。

新变化的范围

  • LocalMachine – 执行策略会影响计算机的所有用户。
  • CurrentUser – 执行策略仅影响当前用户。
  • Process – 执行策略只影响当前的Windows PowerShell进程。

†=默认

例如 :如果您想要将策略更改为仅针对CurrentUser的RemoteSigned,则可以运行以下命令:

 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 

注意 :为了更改执行策略,您必须运行PowerShell作为pipe理员 。 如果您处于常规模式并尝试更改执行策略,则会出现以下错误:

访问registry项“HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell”被拒绝。 要更改默认(LocalMachine)作用域的执行策略,请使用“以pipe理员身份运行”选项启动Windows PowerShell。

如果您想要加强自己的脚本中的内部限制,而这些限制尚未从Internet下载(或者至less不包含UNC元数据),则可以强制策略仅运行签名的脚本。 要签署自己的脚本,可以按照Scott Hanselman关于签署PowerShell脚本的文章中的说明进行操作。

注意 :大多数人在打开PowerShell的时候可能会遇到这个错误,因为PS启动时第一件事就是执行用户configuration文件脚本来设置你的环境,不过你喜欢。

该文件通常位于:

 %UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1 

你可以通过运行powershellvariablesfind确切的位置

 $profile 

如果在configuration文件中没有任何您关心的内容,并且不想在安全设置上大惊小怪,那么您可以将其删除,并且PowerShell将找不到任何无法执行的内容。

在Windows 7中:

转到“开始”菜单并search“Windows PowerShell ISE”。

右键单击x86版本,然后select“以pipe理员身份运行”。

在顶部,粘贴Set-ExecutionPolicy RemoteSigned ; 运行脚本。 select“是”。

为64位版本的Powershell ISE(非x86版本)重复这些步骤。

我只是澄清了@Chad Miller暗示的步骤。 谢谢乍得!

在脚本之前运行这个命令也解决了这个问题:

 set-executionpolicy unrestricted 

如果您处于不是pipe理员的环境中,则可以为您设置执行策略,而不需要pipe理员。

 Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned" 

要么

 Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Unrestricted" 

您可以在帮助条目中阅读所有相关信息。

 Help Get-ExecutionPolicy -Full Help Set-ExecutionPolicy -Full 

RemoteSigned:您自己创build的所有脚本都将运行,并且从Internet上下载的所有脚本都需要由受信任的发布者签名。

好的,只需input以下内容即可更改政策:

 Set-ExecutionPolicy RemoteSigned 

我正在使用Windows 10 ,无法运行任何命令。 给我一些线索的唯一命令是这样的:

[64]

  1. 打开C:\ Windows \ SysWOW64 \ cmd.exe [以pipe理员身份]
  2. 运行命令> powershell Set-ExecutionPolicy Unrestricted

但是这不起作用。 这是有限的。 可能是Windows10的新安全策略。 我有这个错误:

Set-ExecutionPolicy:Windows PowerShell成功更新了您的执行策略,但该设置被在更具体的范围内定义的策略覆盖。 由于覆盖,您的shell将保留其当前的有效执行政策…

所以我find了另一种方法( 解决scheme ):

  1. 打开运行命令/控制台( Win + R
  2. types: gpedit.msc ( 组策略编辑器)
  3. 浏览到本地计算机策略 – > 计算机configuration – > pipe理模板 – > Windows组件 – > Windows Powershell
  4. 启用“启用脚本执行
  5. 根据需要设置策略。 我把我的设置为“ 允许所有脚本 ”。

现在打开PowerShell并享受;)

设置执行策略是特定于环境的。 如果您尝试从正在运行的x86 ISE执行脚本,则必须使用x86 PowerShell来设置执行策略。 同样,如果您正在运行64位ISE,则必须使用64位PowerShell设置策略。

我们可以通过下面的命令获得当前ExecutionPolicy的状态:

 Get-ExecutionPolicy; 

默认情况下它是受限制的 。 为了允许执行PowerShell脚本,我们需要将此ExecutionPolicy设置为BypassUnrestricted

我们可以使用下面的PowerShell命令将当前用户的策略设置为“ Bypass或“ Unrestricted

 Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force; Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force; 

不受限制的策略加载所有configuration文件并运行所有脚本。 如果运行从Internet下载的未签名脚本,则会在运行之前提示您提供权限。

而在旁路策略中,在脚本执行过程中没有任何事件被阻止,也没有警告或提示。 Bypass ExecutionPolicy比Unrestricted更宽松。

您也可以通过使用以下命令来绕过此操作:

 PS > powershell Get-Content .\test.ps1 | Invoke-Expression 

您还可以阅读Scott Sutherland的这篇文章,该文章解释了如果您没有pipe理员权限,则绕过Powershell Set-ExecutionPolicy的15种不同方法。

https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-policy/

在PowerShell ISE编辑器中,我发现运行以下行首先允许的脚本。

 Set-ExecutionPolicy RemoteSigned -Scope Process 

转到registrypathHKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell

并设置ExecutionPolicy:RemoteSigned

pipe理员身份打开Powershell。 它会起作用

如果你在这里是因为使用Ruby或Chef运行它并使用系统执行,请执行如下:

 `powershell.exe -ExecutionPolicy Unrestricted -command [Environment]::GetFolderPath(\'mydocuments\')` 

该命令用于获取“MyDocuments”文件夹。

-ExecutionPolicy Unrestricted的伎俩。

我希望这对别人有帮助。

几个答案指向执行策略。 但有些事情也需要“runaspipe理员”。 这是最安全的,因为执行策略没有永久的变化,并且可以获得过去的pipe理员限制。 与schedtask一起使用来启动批处理:

  runas.exe /savecred /user:administrator powershell -ExecutionPolicy ByPass -File script.ps1 

从上面的杰克·埃德蒙兹和Peter Mortensen / Dhana的post如何在命令提示符下以“以pipe理员身份运行”运行应用程序?

我发现这条线最适合我的Windows Server 2008 R2服务器之一。 其他几个人在我的PowerShell脚本中没有这一行没有问题:

 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force -Scope Process 

在PowerShell 2.0中,执行策略默认设置为禁用。

从那以后,PowerShell团队做了很多改进,他们确信用户在运行脚本的时候不会破坏太多的东西。 所以从PowerShell 4.0开始,它是默认启用的。

你的情况,从PowerShell控制台键入Set-ExecutionPolicy RemoteSigned ,并说是。

win + R并inputcopy past命令,然后按确定

powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"

并执行你的脚本

然后恢复像

powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "AllSigned"

我今天有同样的问题。 64位执行策略不受限制,而32位受限。

以下是如何远程更改32位策略:

 Invoke-Command -ComputerName $servername -ConfigurationName Microsoft.PowerShell32 -scriptblock {Set-ExecutionPolicy unrestricted}