【问题标题】:How do I run a PowerShell script even if Set-ExecutionPolicy is banned?即使 Set-ExecutionPolicy 被禁止,我如何运行 PowerShell 脚本?
【发布时间】:2012-02-14 04:24:02
【问题描述】:

PowerShell的Set-ExecutionPolicy命令被禁止了,所以不能这样运行:

PS> .\script.ps1 (enter)

除了从“Windows PowerShell ISE”之外,还有其他方法可以运行 PowerShell 脚本吗?

PS:我可以使用 Java 的 ProccessBuilder 运行单个 PowerShell 命令,但不知道如何运行整个脚本。

【问题讨论】:

标签: java powershell


【解决方案1】:

这是我们用来从 Java 运行 PowerShell 脚本的工具(无论执行策略如何都可以使用):

powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -File <script_name>

【讨论】:

  • 如果可以直接从命令行绕过执行策略,那么设置它的意义何在?
  • @EricJ。 - 我认为关键是你是从命令行运行的。自动执行的脚本将无法操作命令行,因此将受制于当前策略。可以访问命令行的程序大概已经在当前帐户的范围内具有完全访问权限。
  • @jtahlborn 我的意思是...你不能写一个.bat 对powershell.exe -ExecutionPolicy Bypass 有确切的调用,那么这不算是自动执行吗?
  • @KolobCanyon - 当然,您可以编写一个可以删除用户目录内容的 bat 文件。我不确定你的意思是什么?
  • @jtahlborn 我想我的问题是,如果有人双击.ps1 文件并且Execution Policy == Restricted 是否意味着脚本无法运行?如果您使用上面的命令将其包装在.bat 文件中,您可以覆盖执行策略吗?对吗?
【解决方案2】:

解决这个问题的最简单最愚蠢的方法就是:

gc .\script.ps1 | iex

这在 PowerShell 中有效,与 ExecutionPolicy 无关。只要确保你小心换行。将{}s 和类似内容保留在同一行,在需要时使用;s。

【讨论】:

  • 实现此目的的另一种方法。
【解决方案3】:

Oisin Grehan has an interesting post on his blog 提供了另一种绕过执行策略的方法。打开一个 shell 并运行它:

function Disable-ExecutionPolicy {
    ($ctx = $executioncontext.gettype().getfield(
        "_context", "nonpublic,instance").getvalue(
            $executioncontext)).gettype().getfield(
                "_authorizationManager", "nonpublic,instance").setvalue(
        $ctx, (new-object System.Management.Automation.AuthorizationManager
                  "Microsoft.PowerShell"))
}
Disable-ExecutionPolicy

这将删除允许您从该 shell 调用脚本的默认主机授权管理器。您必须为您打开的每个 shell 运行它,因为执行策略仅在运行它的 shell 中被覆盖。

【讨论】:

    【解决方案4】:

    这是对安迪对这个问题的回答的轻微改进。如果管理员在 GPO 中设置了限制性 PowerShell 脚本执行策略(可能错误地认为 PowerShell 执行策略是安全边界),您可以使用以下命令行获取禁用执行策略的 PowerShell 交互式会话:

    powershell.exe -EncodedCommand ZgB1AG4AYwB0AGkAbwBuACAARABpAHMAYQBiAGwAZQAtAEUAeABlAGMAdQB0AGkAbwBuAFAAbwBsAGkAYwB5AHsAKAAkAGMAdAB4AD0AJABFAHgAZQBjAHUAdABpAG8AbgBDAG8AbgB0AGUAeAB0AC4ARwBlAHQAVAB5AHAAZQAoACkALgBHAGUAdABGAGkAZQBsAGQAKAAiAF8AYwBvAG4AdABlAHgAdAAiACwAIgBuAG8AbgBwAHUAYgBsAGkAYwAsAGkAbgBzAHQAYQBuAGMAZQAiACkALgBHAGUAdABWAGEAbAB1AGUAKAAkAEUAeABlAGMAdQB0AGkAbwBuAEMAbwBuAHQAZQB4AHQAKQApAC4ARwBlAHQAVAB5AHAAZQAoACkALgBHAGUAdABGAGkAZQBsAGQAKAAiAF8AYQB1AHQAaABvAHIAaQB6AGEAdABpAG8AbgBNAGEAbgBhAGcAZQByACIALAAiAG4AbwBuAHAAdQBiAGwAaQBjACwAaQBuAHMAdABhAG4AYwBlACIAKQAuAFMAZQB0AFYAYQBsAHUAZQAoACQAYwB0AHgALAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAdQB0AGgAbwByAGkAegBhAHQAaQBvAG4ATQBhAG4AYQBnAGUAcgAgACIATQBpAGMAcgBvAHMAbwBmAHQALgBQAG8AdwBlAHIAUwBoAGUAbABsACIAKQApAH0AOwBEAGkAcwBhAGIAbABlAC0ARQB4AGUAYwB1AHQAaQBvAG4AUABvAGwAaQBjAHkAOwBpAGYAKABUAGUAcwB0AC0AUABhAHQAaAAgACQAUABSAE8ARgBJAEwARQApAHsALgAgACQAUABSAE8ARgBJAEwARQB9AA== -NoExit
    

    这里的-EncodedCommand是以下代码:

    function Disable-ExecutionPolicy{($ctx=$ExecutionContext.GetType().GetField("_context","nonpublic,instance").GetValue($ExecutionContext)).GetType().GetField("_authorizationManager","nonpublic,instance").SetValue($ctx,(New-Object Management.Automation.AuthorizationManager "Microsoft.PowerShell"))};Disable-ExecutionPolicy;if(Test-Path $PROFILE){. $PROFILE}
    

    也就是说,通过运行安迪回答中描述的函数来禁用执行策略,然后点源当前用户配置文件脚本(如果存在)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2011-01-03
      • 2018-09-10
      • 2023-03-20
      • 2021-07-04
      • 1970-01-01
      • 2011-06-06
      相关资源
      最近更新 更多