PowerShell says “execution of scripts is disabled on this system.”
我正在尝试运行一个从
Management_Install.ps1 cannot be loaded because the execution of scripts is disabled on this system.
我已经跑了
1 | Set-ExecutionPolicy -ExecutionPolicy Unrestricted |
当我从PowerShell运行
1 2 | PS C:\Users\Administrator\> Get-ExecutionPolicy Unrestricted |
1 2 3 | C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> powershell .\Management_Install.ps1 1 WARNING: Running x86 PowerShell... |
File
C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\Management_Install.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see"get-help about_signing " for more details.At line:1 char:25
.\Management_Install.ps1 <<<< 1
CategoryInfo : NotSpecified: (:) [], PSSecurityException
FullyQualifiedErrorId : RuntimeException
1 2 3 | C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> PAUSE Press any key to continue . . . |
系统是Windows Server 2008R2。
我做错什么了?
如果您使用的是Windows Server 2008 R2,则PowerShell的x64和x86版本都必须设置其执行策略。您在两台主机上都设置了执行策略吗?
作为管理员,您可以通过在PowerShell窗口中键入以下内容来设置执行策略:
1 | Set-ExecutionPolicy RemoteSigned |
有关详细信息,请参阅使用set-executionpolicy cmdlet。
运行PowerShell时,可以通过添加
1 | powershell -ExecutionPolicy ByPass -File script.ps1 |
我遇到了类似的问题,并注意到WindowsServer2012上的默认
对于Windows 7、Windows 8、Windows 10、Windows Server 2008 R2或Windows Server 2012,请以管理员身份运行以下命令:
x86(32位)
打开
运行命令
x64(64位)
打开
运行命令
您可以使用检查模式
- 在命令:
echo %PROCESSOR_ARCHITECTURE% 中 - 在PowerShell中:
[Environment]::Is64BitProcess 。
参考文献:
msdn-Windows PowerShell执行策略
Windows-32位vs 64位目录说明
大多数现有的答案解释了如何进行,但很少有人解释了原因。在你到处执行来自互联网上陌生人的代码之前,尤其是那些禁用安全措施的代码,你应该清楚你在做什么。下面是关于这个问题的更多细节。
从TechNet关于执行策略页面:
Windows PowerShell execution policies let you determine the conditions under which Windows PowerShell loads configuration files and runs scripts.
PowerShell基础-执行策略和代码签名列举的好处包括:
- Control of Execution - Control the level of trust for executing scripts.
- Command Highjack - Prevent injection of commands in my path.
- Identity - Is the script created and signed by a developer I trust and/or a signed with a certificate from a Certificate Authority I trust.
- Integrity - Scripts cannot be modified by malware or malicious user.
要检查当前的执行策略,可以运行
为此,您将运行
在更新执行策略时,您需要做两个主要的决定。
执行策略类型:- EDOCX1?2?-系统上不能执行本地、远程或下载的脚本。
AllSigned -运行的所有脚本都需要数字签名。RemoteSigned —所有远程脚本(unc)或下载的脚本都需要签名。Unrestricted —任何类型的脚本都不需要签名。
新变更范围
- EDOCX1?6?-执行策略影响计算机的所有用户。
CurrentUser —执行策略只影响当前用户。Process —执行策略仅影响当前的Windows PowerShell进程。
?=默认值
例如:如果您想将策略更改为仅对当前用户进行远程签名,则可以运行以下命令:
1 | Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser |
注意:为了更改执行策略,必须以管理员身份运行PowerShell。如果您处于常规模式并尝试更改执行策略,则会出现以下错误:
Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied. To change the execution policy for the default (LocalMachine) scope, start Windows PowerShell with the"Run as administrator" option.
如果要加强对尚未从Internet下载(或至少不包含UNC元数据)的脚本的内部限制,可以强制策略仅运行签名的SRIPT。要签署自己的脚本,可以按照Scott Hanselman关于签署PowerShell脚本的文章中的说明进行操作。
注意:大多数人在每次打开PowerShell时都可能会遇到此错误,因为ps在启动时要做的第一件事是执行用户配置文件脚本,该脚本可以根据您的喜好设置环境。
文件通常位于:
1 | %UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1 |
通过运行powershell变量,可以找到确切的位置。
1 | $profile |
如果您不关心配置文件中的任何内容,也不想对您的安全设置大惊小怪,您只需删除它,PowerShell就不会找到它无法执行的任何内容。
在Windows 7中:
转到"开始"菜单并搜索"Windows PowerShell ISE"。
右键单击x86版本并选择"以管理员身份运行"。
在顶部,粘贴
对64位版本的PowerShellISE(非x86版本)也重复这些步骤。
我只是在澄清@chad miller暗示的步骤。谢谢乍得!
同时在脚本解决问题之前运行此命令:
1 | set-executionpolicy unrestricted |
如果您所处的环境不是管理员,则可以仅为您设置执行策略,而不需要管理员。
1 | Set-ExecutionPolicy -Scope"CurrentUser" -ExecutionPolicy"RemoteSigned" |
或
1 | Set-ExecutionPolicy -Scope"CurrentUser" -ExecutionPolicy"Unrestricted" |
您可以在帮助条目中阅读关于它的所有信息。
1 2 | Help Get-ExecutionPolicy -Full Help Set-ExecutionPolicy -Full |
远程签名:您自己创建的所有脚本都将运行,从Internet下载的所有脚本都需要由受信任的发布者签名。
好的,只需键入以下内容即可更改策略:
1 | Set-ExecutionPolicy RemoteSigned |
我们可以通过下面的命令得到当前
1 | Get-ExecutionPolicy; |
默认情况下,它是受限制的。要允许执行PowerShell脚本,我们需要将此ExecutionPolicy设置为Bypass或Unrestricted。
我们可以使用以下任何PowerShell命令将当前用户的策略设置为
1 2 3 | Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force; Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force; |
无限制策略加载所有配置文件并运行所有脚本。如果运行从Internet下载的未签名脚本,则会在运行该脚本之前提示您输入权限。
而在旁路策略中,没有阻塞任何内容,脚本执行期间也没有警告或提示。旁路
我正在使用Windows 10,无法运行任何命令。唯一给我一些线索的命令是:
[X64 ]
Open C:\Windows\SysWOW64\cmd.exe [as administrator] Run the command> powershell Set-ExecutionPolicy Unrestricted
但这不起作用。它是有限的。可能是Windows10的新安全策略。我犯了这个错误:
Set-ExecutionPolicy: Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope. Due to the override, your shell will retain its current effective execution policy of...
所以我找到了另一种方法(解决方案):
现在打开PowerShell并享受;)
设置执行策略是环境特定的。如果试图从正在运行的x86 ISE执行脚本,则必须使用x86 PowerShell设置执行策略。同样,如果运行64位ISE,则必须使用64位PowerShell设置策略。
winakbd+r,键入copy-paste命令,然后按ok:
1 | powershell Set-ExecutionPolicy -Scope"CurrentUser" -ExecutionPolicy"RemoteSigned" |
然后执行脚本。
然后恢复如下更改:
1 | powershell Set-ExecutionPolicy -Scope"CurrentUser" -ExecutionPolicy"AllSigned" |
您还可以使用以下命令绕过此操作:
1 | PS > powershell Get-Content .\test.ps1 | Invoke-Expression |
您还可以阅读Scott Sutherland的这篇文章,其中解释了15种不同的绕过PowerShell
绕过PowerShell执行策略的15种方法
在PowerShellISE编辑器中,我发现首先允许运行以下行脚本。
1 | Set-ExecutionPolicy RemoteSigned -Scope Process |
在PowerShell 2.0中,默认情况下执行策略设置为禁用。
从那时起,PowerShell团队做了很多改进,他们相信用户在运行脚本时不会破坏很多东西。因此,从PowerShell4.0开始,默认情况下启用它。
在您的例子中,从PowerShell控制台键入
转到注册表路径
如果您在这里是因为使用Ruby或Chef运行它并使用``系统执行,请执行以下操作:
1 | `powershell.exe -ExecutionPolicy Unrestricted -command [Environment]::GetFolderPath(\'mydocuments\')` |
该命令用于获取"mydocuments"文件夹。
希望对别人有帮助。
几个答案指向执行策略。然而,有些事情也需要"runas管理员"。这是最安全的,因为执行策略没有永久性的更改,并且可以通过管理员的限制。与schedtask一起使用可启动批处理:
1 | runas.exe /savecred /user:administrator powershell -ExecutionPolicy ByPass -File script.ps1 |
来自上面的jack edmonds和post的peter mortensen/dhana,如何在命令提示符下以"以管理员身份运行"的身份运行应用程序?
以管理员身份打开PowerShell窗口。它会起作用的。
我今天也遇到了同样的问题。64位执行策略是不受限制的,而32位是受限制的。
以下是如何远程更改32位策略:
1 | Invoke-Command -ComputerName $servername -ConfigurationName Microsoft.PowerShell32 -scriptblock {Set-ExecutionPolicy unrestricted} |
我发现这一行对我的一个Windows Server 2008 R2服务器最有效。在我的PowerShell脚本中,如果没有这一行,其他一些人就没有问题:
1 | Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force -Scope Process |