我正在尝试运行一个从cmd.exe
调用powershell脚本的cmd文件,并且出现以下错误:
无法加载
Management_Install.ps1
因为在此系统上禁用了脚本的执行。
我跑了
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
当我从powershell运行Get-ExecutionPolicy
时,我得到了Unrestricted
。
PS C:\Users\Administrator\> Get-ExecutionPolicy
Unrestricted
C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> powershell .\Management_Install.ps1 1
WARNING: Running 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:未指定:(:) [],PSSecurityException
FullyQualifiedErrorId:RuntimeException
C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\> PAUSE
Press any key to continue . . .
系统是Windows Server 2008R2。
我究竟做错了什么?
#1楼
设置执行策略是特定于环境的。 如果尝试从运行的x86 ISE执行脚本,则必须使用x86 PowerShell设置执行策略。 同样,如果运行的是64位ISE,则必须使用64位PowerShell设置策略。
#2楼
在Windows 7中:
转到“开始”菜单,然后搜索“ Windows PowerShell ISE”。
右键单击x86版本,然后选择“以管理员身份运行”。
在顶部,粘贴Set-ExecutionPolicy RemoteSigned
; 运行脚本。 选择“是”。
对64位版本的Powershell ISE(非x86版本)也重复这些步骤。
我只是在澄清@Chad Miller暗示的步骤。 谢谢乍得!
#3楼
我遇到了类似的问题,并注意到Windows Server 2012上的默认cmd
正在运行x64。
对于Windows 7 , Windows 8 , Windows 10 , Windows Server 2008 R2或Windows Server 2012 ,以管理员身份运行以下命令:
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位目录说明
#4楼
如果您所在的环境不是管理员,则可以只为您设置执行策略,并且不需要管理员。
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"
要么
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Unrestricted"
您可以在帮助条目中阅读所有相关信息。
Help Get-ExecutionPolicy -Full
Help Set-ExecutionPolicy -Full
#5楼
如果您是因为使用Ruby或Chef运行它并使用``系统执行而在这里,请执行以下操作:
`powershell.exe -ExecutionPolicy Unrestricted -command [Environment]::GetFolderPath(\'mydocuments\')`
该命令用于获取“ MyDocuments”文件夹。
-ExecutionPolicy Unrestricted
可以解决问题。
希望对其他人有帮助。
#6楼
大多数现有的答案解释如何 ,却很少解释为什么 。 并且,在四处执行来自Internet上陌生人的代码(尤其是禁用安全措施的代码)之前,您应该确切地了解自己在做什么。 因此,这里有更多有关此问题的详细信息。
从TechNet 关于执行策略页面 :
Windows PowerShell执行策略使您可以确定Windows PowerShell加载配置文件和运行脚本的条件。
如PowerShell基础知识-执行策略和代码签名所列举的,其优点是:
- 执行控制-控制执行脚本的信任级别。
- Command Highjack-防止在我的路径中注入命令。
- 身份 -由我信任的开发人员创建和签名的脚本,和/或由我信任的证书颁发机构颁发的证书签名的脚本。
- 完整性 -脚本不能被恶意软件或恶意用户修改。
要检查当前的执行策略,可以运行Get-ExecutionPolicy
。 但是您可能在这里,因为您想更改它。
为此,您将运行Set-ExecutionPolicy
cmdlet。
更新执行策略时,您需要做出两个主要决定。
执行策略类型:
-
Restricted
† -无法在系统上执行本地,远程或下载的脚本。 -
AllSigned
运行的所有脚本都需要进行数字签名。 -
RemoteSigned
所有远程脚本(UNC)或下载的都需要签名。 -
Unrestricted
-不需要任何类型的脚本的签名。
新变更范围
-
LocalMachine
† -执行策略会影响计算机的所有用户。 -
CurrentUser
执行策略仅影响当前用户。 -
Process
-执行策略仅影响当前的Windows PowerShell进程。
†=默认
例如 :如果仅要将CurrentUser的策略更改为RemoteSigned,则可以运行以下命令:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
注意 :为了更改执行策略,您必须正在运行PowerShell As Adminstrator 。 如果您处于常规模式下并尝试更改执行策略,则会收到以下错误:
拒绝访问注册表项'HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Microsoft \\ PowerShell \\ 1 \\ ShellIds \\ Microsoft.PowerShell'。 若要更改默认(LocalMachine)范围的执行策略,请使用“以管理员身份运行”选项启动Windows PowerShell。
如果要加强对尚未从Internet下载的脚本的内部限制(或至少不包含UNC元数据),则可以强制该策略仅运行签名的摘要。 要签署自己的脚本,您可以按照Scott Hanselman的“ 签署PowerShell脚本”文章中的说明进行操作。
注意 :大多数人在打开Powershell时很可能会收到此错误,因为PS启动时试图做的第一件事是执行您的用户配置文件脚本来设置您喜欢的环境。
该文件通常位于:
%UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1
您可以通过运行powershell变量找到确切的位置
$profile
如果您在配置文件中不需要任何内容,并且不想大惊小怪的安全设置,则可以将其删除,而powershell将找不到它无法执行的任何操作。
#7楼
在PowerShell ISE编辑器中,我发现运行以下第一行允许的脚本。
Set-ExecutionPolicy RemoteSigned -Scope Process
#8楼
我发现此行最适合我的Windows Server 2008 R2服务器之一。 在我的PowerShell脚本中,没有此行,其他几个就没有问题:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force -Scope Process
#9楼
我正在使用Windows 10 ,无法运行任何命令。 唯一给我一些线索的命令是:
[x64]
- 以管理员身份打开C:\\ Windows \\ SysWOW64 \\ cmd.exe
- 运行命令> powershell Set-ExecutionPolicy Unrestricted
但这没有用。 它是有限的。 Windows10可能是新的安全策略。 我有这个错误:
Set-ExecutionPolicy:Windows PowerShell成功更新了您的执行策略,但是该设置被在更特定范围内定义的策略覆盖。 由于覆盖,您的外壳将保留其当前有效的执行策略...
所以我找到了另一种方式( 解决方案 ):
- 打开运行命令/控制台( Win + R )
- 类型: gpedit.msc ( 组策略编辑器)
- 浏览到本地计算机策略 -> 计算机配置 -> 管理模板 -> Windows组件 -> Windows Powershell 。
- 启用“ 打开脚本执行 ”
- 根据需要设置策略。 我将我的设置为“ 允许所有脚本 ”。
现在打开PowerShell并享受;)
#10楼
在PowerShell 2.0中,默认情况下将执行策略设置为禁用。
从那时起,PowerShell团队进行了许多改进,他们坚信用户在运行脚本时不会破坏很多东西。 因此,从PowerShell 4.0开始,默认情况下将其启用。
在您的情况下,从PowerShell控制台中键入Set-ExecutionPolicy RemoteSigned
,然后说是。
#11楼
有几个答案指向执行策略。 但是,有些事情也需要“ runas管理员”。 这是最安全的,因为不会对执行策略进行永久更改,并且可以摆脱管理员的限制。 与schedtask一起使用以开始以下操作的批处理:
runas.exe /savecred /user:administrator powershell -ExecutionPolicy ByPass -File script.ps1
上面的Jack Edmonds和文章的Peter Mortensen / Dhana的文章如何从命令提示符下以“以管理员身份运行”来运行应用程序?
#12楼
我们可以通过以下命令获取当前ExecutionPolicy
的状态:
Get-ExecutionPolicy;
默认情况下,它是Restricted 。 为了允许执行PowerShell脚本,我们需要将此ExecutionPolicy设置为Bypass或Unrestricted 。
我们可以使用以下任何PowerShell命令将“当前用户”的策略设置为“ Bypass
或“ Unrestricted
:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force;
不受限制的策略将加载所有配置文件并运行所有脚本。 如果运行从Internet下载的未签名脚本,则会在运行之前提示您获得许可。
而在“ 绕过”策略中,没有任何内容被阻止,并且在脚本执行过程中没有警告或提示。 绕过ExecutionPolicy
比Unrestricted
。
#13楼
转到注册表路径HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.PowerShell
并将ExecutionPolicy
设置为RemoteSigned
。
#14楼
如果您使用的是Windows Server 2008 R2,则必须安装x64和x86版本的PowerShell,这两个版本都必须设置其执行策略。 您是否在两台主机上都设置了执行策略?
作为管理员 ,您可以通过在PowerShell窗口中键入以下内容来设置执行策略:
Set-ExecutionPolicy RemoteSigned
有关更多信息,请参见使用Set-ExecutionPolicy Cmdlet 。
#15楼
您也可以使用以下命令绕过此操作:
PS > powershell Get-Content .\test.ps1 | Invoke-Expression
您还可以阅读Scott Sutherland的这篇文章,其中介绍了15种不同的绕过PowerShell Set-ExecutionPolicy
如果没有管理员权限)的方法:
#16楼
以管理员身份打开PowerShell窗口。 它会工作。
#17楼
Win + R并键入copy paste命令,然后按OK :
powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"
并执行您的脚本。
然后还原更改,例如:
powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "AllSigned"
#18楼
我今天有同样的问题。 64位执行策略不受限制,而32位则受限制。
以下是仅远程更改32位策略的方法:
Invoke-Command -ComputerName $servername -ConfigurationName Microsoft.PowerShell32 -scriptblock {Set-ExecutionPolicy unrestricted}
#19楼
- 以管理员身份打开PowerShell并运行Set-ExecutionPolicy -Scope CurrentUser
- 提供RemoteSigned ,然后按Enter
- 运行Set-ExecutionPolicy -Scope CurrentUser
- 提供不受限制 ,然后按Enter
#20楼
RemoteSigned:您创建的所有脚本都将运行,并且从Internet下载的所有脚本都需要由受信任的发布者签名。
确定,只需键入以下内容即可更改策略:
Set-ExecutionPolicy RemoteSigned
#21楼
您可以在运行PowerShell时通过添加-ExecutionPolicy ByPass
来绕过此策略
powershell -ExecutionPolicy ByPass -File script.ps1
#22楼
在脚本还解决问题之前,还要运行此命令:
set-executionpolicy unrestricted