PowerShell 说“在这个系统上禁用了脚本的执行”。
Posted
技术标签:
【中文标题】PowerShell 说“在这个系统上禁用了脚本的执行”。【英文标题】:PowerShell says "execution of scripts is disabled on this system." 【发布时间】:2011-05-01 13:51:37 【问题描述】:我正在尝试运行一个从 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
警告:正在运行 x86 PowerShell...
无法加载文件
C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts\Management_Install.ps1
,因为此系统上禁用了脚本执行。详情请见“get-help about_signing
”。在 line:1 char:25
.\Management_Install.ps1
CategoryInfo : NotSpecified: (:) [], PSSecurityException
FullyQualifiedErrorId : RuntimeException
C:\Projects\Microsoft.Practices.ESB\Source\Samples\Management Portal\Install\Scripts> 暂停
按任意键继续。 . .
系统是Windows Server 2008R2。
我做错了什么?
【问题讨论】:
值得指出的是,Execution Policy 具有多个作用域,以不同的方式运行 PowerShell 可以获得不同的策略。要查看策略列表,请运行Get-ExecutionPolicy -List
。
所有政策explanations are here。
【参考方案1】:
如果您使用的是Windows Server 2008 R2,那么有一个 x64 和 x86 版本的 PowerShell,两者都必须设置其执行策略。您是否在两台主机上都设置了执行策略?
作为管理员,您可以通过在 PowerShell 窗口中键入以下内容来设置执行策略:
Set-ExecutionPolicy RemoteSigned
有关详细信息,请参阅 Using the Set-ExecutionPolicy Cmdlet。
完成后,您可以将策略设置回其默认值:
Set-ExecutionPolicy Restricted
您可能会看到一个错误:
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.
To change the execution policy for the current user,
run "Set-ExecutionPolicy -Scope CurrentUser".
所以你可能需要像这样运行命令(如 cmets 所示):
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
【讨论】:
Set-ExecutionPolicy Restricted
如果您想将权限恢复原样,似乎是撤消它的方法:technet.microsoft.com/en-us/library/ee176961.aspx。 @Jack Edmonds
的临时绕过方法对我来说看起来更安全:powershell -ExecutionPolicy ByPass -File script.ps1
要获得更安全的策略,请将其范围限定为实际用户:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Set-ExecutionPolicy RemoteSigned 不能是脚本的第一行。如果是,请在运行脚本的其余部分之前突出显示它并仅在最初选择运行。
我在 SF 网站上遇到了类似的问题,"Powershell execution policy within SQL Server” 于 2014 年 10 月 10 日提出。那里的答案包括Get-ExecutionPolicy -List
,它帮助我看到了不同的范围。 cmd Get-ExecutionPolicy
未显示所有范围。 Import-Module SQLPS
现在正在使用以下更改的策略:Undefined- Process,MachinePolicy,UserPolicy,; RemoteSigned- CurrentUser, LocalMachine
。
如果我这样做,更改是否只持续当前 PowerShell 的持续时间?还是比这更大?【参考方案2】:
RemoteSigned:您自己创建的所有脚本都将运行,并且从 Internet 下载的所有脚本都需要由受信任的发布者签名。
好的,只需键入以下内容即可更改策略:
Set-ExecutionPolicy RemoteSigned
【讨论】:
正如其他帖子中的建议:明智的做法是在有意义的情况下包含“-Scope CurrentUser”以获得更安全的策略。【参考方案3】:您可以通过在运行 PowerShell 时添加 -ExecutionPolicy Bypass
来绕过单个文件的此策略
powershell -ExecutionPolicy Bypass -File script.ps1
【讨论】:
如果您使用的是非管理员帐户,这也非常方便。我在任务栏上创建了%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass
的快捷方式。
请注意,Microsoft Technet 将其风格化为“绕过”,而不是“绕过”。见:technet.microsoft.com/nl-nl/library/hh849812.aspx
这对我不起作用,我得到的权限被拒绝,就像我正常调用它一样。通过 type script.ps1 | powershell -
从 .bat 调用 ps1 确实有效。
执行策略的目的是防止人们双击.ps1
并意外运行他们不打算执行的操作。 .bat
文件会发生这种情况
A parameter cannot be found that matches parameter name 'File'
命令:Set-ExecutionPolicy -ExecutionPolicy Bypass -File .\file.ps1
【参考方案4】:
在脚本之前运行此命令也可以解决问题:
set-executionpolicy unrestricted
【讨论】:
-1 - 遵循最少权限原则。至少将策略设置为RemoteSigned
,然后再删除对您的安全策略的所有限制。如果这不起作用,那么重新评估您的痛点是什么以及为什么它不起作用。您可以将unrestricted
设置为最后的手段,但这不应该是您的起点。
也感谢您指出这个选项。在充分尊重生产目的的安全需求的情况下,在快速原型制作能力需求如此之高的时代,所有的策略和安全性确实阻碍了完成工作。
关于评论重新原型,恐怕这就是为什么糟糕的代码进入生产。当然这只是一个琐碎的例子,但是如果你在开发过程中不能解决这个琐碎的事情,那就是担心发布。此外,对于定制代码,如果可以,请了解目标环境 - 我们将大部分内部系统设置为 Remotesigned
。【参考方案5】:
设置执行策略是特定于环境的。如果您尝试从正在运行的 x86 ISE 执行脚本,则必须使用 x86 PowerShell 来设置执行策略。同样,如果您运行的是 64 位 ISE,则必须使用 64 位 PowerShell 设置策略。
【讨论】:
【参考方案6】:在 Windows 7 中:
转到“开始”菜单并搜索“Windows PowerShell ISE”。
右键单击 x86 版本并选择“以管理员身份运行”。
在顶部,粘贴Set-ExecutionPolicy RemoteSigned
;运行脚本。选择“是”。
对于 64 位版本的 Powershell ISE(非 x86 版本)也重复这些步骤。
我只是澄清@Chad Miller 暗示的步骤。谢谢乍得!
【讨论】:
在 Windows 8 中,这也是有效的。我设置了 Set-ExecutionPolicy RemoteSigned;仅在 Windows Powershell 中,以管理员身份运行。 x86 版本无需重复此过程。【参考方案7】:我遇到了类似的问题,并注意到 Windows Server 2012 上的默认 cmd
正在运行 x64。
适用于 Windows 11、Windows 10、Windows 7、Windows 8、Windows Server 2008 R2 或 Windows Server 2012,以 Administrator 身份运行以下命令:
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 execution policiesWindows - 32bit vs 64bit directory explanation
【讨论】:
在 windows10 中为我工作 为我在 vscode 上的 nodemon 安装过程工作。干杯。 在 windows 10 x64 上工作 非常感谢,在 Windows 10 中为我工作,VSCode! 非常感谢【参考方案8】:如果您处于非管理员的环境中,您可以为您设置执行策略,它不需要管理员。
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"
或
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Unrestricted"
您可以在帮助条目中阅读所有相关信息。
Help Get-ExecutionPolicy -Full
Help Set-ExecutionPolicy -Full
【讨论】:
在 Windows 8 中对我来说非常有用,即使Set-ExecutionPolicy Unrestricted
作为管理员似乎并没有“无限制”地提供实际帮助。
我相信您可能遇到的是 GPO 或其他内容,它覆盖了您对 ExecutionPolicy 的“LocalMachine”级别的设置。您不能使用 Set-ExecutionPolicy 命令覆盖域策略的内容。但是,但是设置“CurrentUser”访问级别,只有您才能拥有指定的执行策略。这是因为计算机在查看 LocalMachine 设置之前查看 CurrentUser 的执行策略。
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "Unrestricted" 是唯一对我有用的解决方案。谢谢【参考方案9】:
如果你是因为使用Ruby或Chef运行它并使用``系统执行,执行如下:
`powershell.exe -ExecutionPolicy Unrestricted -command [Environment]::GetFolderPath(\'mydocuments\')`
该命令用于获取“MyDocuments”文件夹。
-ExecutionPolicy Unrestricted
可以解决问题。
我希望它对其他人有帮助。
【讨论】:
封闭的``真的应该在那里吗?【参考方案10】:大多数现有答案都解释了如何,但很少有人解释为什么。在你到处执行互联网上陌生人的代码之前,尤其是禁用安全措施的代码之前,你应该清楚地了解你在做什么。所以这里有更多关于这个问题的细节。
来自 TechNet About Execution Policies Page:
Windows PowerShell 执行策略可让您确定 Windows PowerShell 加载配置文件和运行脚本的条件。
PowerShell Basics - Execution Policy and Code Signing 列举的好处是:
执行控制 - 控制执行脚本的信任级别。 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 作为管理员。 如果您处于常规模式并尝试更改执行策略,您将收到以下错误:
拒绝访问注册表项“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell”。要更改默认 (LocalMachine) 范围的执行策略,请使用“以管理员身份运行”选项启动 Windows PowerShell。
如果您想加强对您自己的尚未从 Internet 下载的脚本(或至少不包含 UNC 元数据)的内部限制,您可以强制该策略仅运行签名的脚本。要签署您自己的脚本,您可以按照 Scott Hanselman 在Signing PowerShell Scripts 上的文章中的说明进行操作。
注意:大多数人在打开 Powershell 时可能会遇到此错误,因为 PS 在启动时尝试做的第一件事是执行您的用户配置文件脚本,该脚本设置您喜欢的环境.
该文件通常位于:
%UserProfile%\My Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1
您可以通过运行 powershell 变量找到确切位置
$profile
如果配置文件中没有您关心的内容,并且不想对您的安全设置大惊小怪,您可以将其删除,powershell 将找不到任何无法执行的内容。
【讨论】:
我觉得重要的是要注意,虽然执行策略是一种安全措施,但它并非旨在阻止用户执行 PowerShell 代码。执行政策旨在保护您的脚本并确定谁编写、修改或批准了它们,仅此而已。 get around execution policy 用Get-Content .\MyFile.ps1 | powershell.exe -NoProfile -
这样简单的东西是微不足道的。
鉴于-ExecutionPolicy ByPass
的存在,这个政策的目的到底是什么?是否只是为了防止用户意外打开powershell控制台并运行恶意脚本?如果攻击者想解决这个问题,他们不能只使用可执行文件或批处理脚本吗?即使在阅读@BaconBits 评论后,我也不太确定该政策旨在防止什么情况......
@Ajedi32 假设我有一个在网络共享上运行脚本的任务。当我调用我的脚本时,我希望我的进程验证脚本是否已签名。我希望我的代码仔细检查我要运行的脚本是我信任运行的代码。我不在乎你是否可以运行我的代码。停止这是访问权限的工作。我只是想阻止你让我运行不是我写的代码。访问权限意味着操作系统会阻止您在登录时修改我的代码。代码签名和执行策略意味着我的脚本在我去运行它时没有被修改。
展示如何签署脚本而不是如何禁用安全性怎么样?这是一个选择吗?
@gman,我认为这是一个公平的观点。要众包工作,您当然可以添加该答案或附加到这个答案。【参考方案11】:
在 PowerShell ISE 编辑器中,我发现运行以下行首先允许脚本。
Set-ExecutionPolicy RemoteSigned -Scope Process
【讨论】:
【参考方案12】:我发现这条线路最适合我的一台Windows Server 2008 R2 服务器。在我的 PowerShell 脚本中,如果没有这一行,其他几个人没有问题:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Force -Scope Process
【讨论】:
【参考方案13】:我使用的是 Windows 10,无法运行任何命令。唯一给我一些线索的命令是:
[x64]
打开 C:\Windows\SysWOW64\cmd.exe [以管理员身份] 运行命令> powershell Set-ExecutionPolicy Unrestricted
但这没有用。这是有限的。可能是 Windows10 的新安全策略。我有这个错误:
Set-ExecutionPolicy:Windows PowerShell 成功更新了您的执行策略,但该设置被在更具体范围内定义的策略覆盖。由于覆盖,您的 shell 将保留其当前有效的执行策略...
于是我找到了另一种方法(解决方案):
-
打开运行命令/控制台 (Win + R)
类型:gpedit.msc(Group PolicyEditor)
浏览到 本地计算机策略 -> 计算机配置 -> 管理模板 -> Windows 组件 -> Windows Powershell。
启用“开启脚本执行”
根据需要设置策略。我将我的设置为“允许所有脚本”。
现在打开 PowerShell 并享受 ;)
【讨论】:
这是独立安装,还是您连接到工作组或域? 为什么要打开cmd来做呢?只需打开 ISE(以管理员身份)并输入Set-ExecutionPolicy RemoteSigned
天哪,这终于修好了我的 win10 盒子,@kolob set-executionpolicy 还不够
你不应该使用Unrestricted
。最好使用RemoteSigned
@xer0x 只要你以管理员身份运行 powershell 就应该是这样【参考方案14】:
在 PowerShell 2.0 中,执行策略默认设置为禁用。
从那时起,PowerShell 团队做了很多改进,他们相信用户在运行脚本时不会破坏太多东西。所以从 PowerShell 4.0 开始,它默认是启用的。
在您的情况下,从 PowerShell 控制台输入 Set-ExecutionPolicy RemoteSigned
并说是。
【讨论】:
【参考方案15】:几个答案指向执行策略。然而,有些事情也需要“runas 管理员”。这是最安全的,因为执行策略不会永久更改,并且可以通过管理员限制。与 schedtask 一起使用以启动批处理:
runas.exe /savecred /user:administrator powershell -ExecutionPolicy ByPass -File script.ps1
来自上面的 Jack Edmonds 和 How to run an application as "run as administrator" from the command prompt? 帖子的 Peter Mortensen / Dhana
【讨论】:
【参考方案16】:我们可以通过以下命令获取当前ExecutionPolicy
的状态:
Get-ExecutionPolicy
默认情况下是受限。要允许执行 PowerShell 脚本,我们需要将此 ExecutionPolicy 设置为 Unrestricted 或 Bypass。
我们可以使用以下任何 PowerShell 命令将当前用户的策略设置为 Bypass
:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force
无限制策略加载所有配置文件并运行所有脚本。如果您运行从 Internet 下载的未签名脚本,系统会在运行前提示您获得许可。
而在 绕过 策略中,没有任何内容被阻止,并且在脚本执行期间没有警告或提示。绕过ExecutionPolicy
比Unrestricted
轻松。
【讨论】:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;
AKA 告诉 VS2015 停止抱怨并运行我该死的脚本的快速而肮脏的方式。谢谢。救命稻草。
命令末尾的分号是多余的。【参考方案17】:
转到注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
并将ExecutionPolicy
设置为RemoteSigned
。
【讨论】:
1.以管理员身份打开 PowerShell 并运行 Set-ExecutionPolicy -Scope CurrentUser 2. 提供 RemoteSigned 并按 Enter 3. 运行 Set-ExecutionPolicy -Scope CurrentUser 4 . 提供 Unrestricted 并按 Enter 键【参考方案18】:你也可以使用以下命令绕过这个:
PS > powershell Get-Content .\test.ps1 | Invoke-Expression
如果您没有管理员权限,您还可以阅读 Scott Sutherland 的这篇文章,其中解释了 15 种绕过 PowerShell Set-ExecutionPolicy
的不同方法:
15 Ways to Bypass the PowerShell Execution Policy
【讨论】:
这可能是排除故障和了解此限制的更有吸引力的指南之一。【参考方案19】:以管理员身份打开 PowerShell 窗口。它会起作用的。
【讨论】:
它不起作用。但是,运行 powershell Set-ExecutionPolicy RemoteSigned 确实有效。【参考方案20】:Win + R 并输入复制粘贴命令并按OK:
powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"
然后执行你的脚本。
然后还原更改,例如:
powershell Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "AllSigned"
【讨论】:
【参考方案21】:我今天也遇到了同样的问题。 64 位执行策略不受限制,而 32 位执行策略受到限制。
以下是仅远程更改 32 位策略的方法:
Invoke-Command -ComputerName $servername -ConfigurationName Microsoft.PowerShell32 -scriptblock Set-ExecutionPolicy unrestricted
【讨论】:
【参考方案22】:-
以管理员身份打开 PowerShell 并运行 Set-ExecutionPolicy -Scope CurrentUser
提供RemoteSigned并按Enter
运行 Set-ExecutionPolicy -Scope CurrentUser
提供无限制并按 Enter
【讨论】:
【参考方案23】:你可以使用特殊的方式绕过它:
Get-Content "PS1scriptfullpath.ps1" | Powershell-NoProfile -
它将 powershell 脚本的内容通过管道传输到 powershell.exe 并绕过执行策略执行它。
【讨论】:
【参考方案24】:这解决了我的问题
打开 Windows PowerShell
命令并运行以下查询以更改 ExecutionPolicy
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
如果它要求确认更改,请按“Y”并回车。
【讨论】:
【参考方案25】:当我尝试运行 Set-ExecutionPolicy RemoteSigned
时收到另一个警告
我用这个命令解决了
Set-ExecutionPolicy "RemoteSigned" -Scope Process -Confirm:$false
Set-ExecutionPolicy "RemoteSigned" -Scope CurrentUser -Confirm:$false
【讨论】:
【参考方案26】:打开 cmd 而不是 powershell。这对我有帮助...
【讨论】:
【参考方案27】:你可以试试这个并选择“全部”选项
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
【讨论】:
【参考方案28】:以管理员身份打开Powershell控制台,然后设置执行策略
Set-ExecutionPolicy -ExecutionPolicy Remotesigned
【讨论】:
【参考方案29】:运行Set-ExecutionPolicy RemoteSigned
命令
【讨论】:
【参考方案30】:-
以管理员身份打开 powershell
Set-ExecutionPolicy -Scope "CurrentUser" -ExecutionPolicy "RemoteSigned"
使用这个命令
【讨论】:
以上是关于PowerShell 说“在这个系统上禁用了脚本的执行”。的主要内容,如果未能解决你的问题,请参考以下文章