从提升的主机/控制台启动“powershell.exe -NoProfile”的非提升实例

问题描述 投票:0回答:1

我正在尝试从提升的 PowerShell/ISE/pwsh/VSCode 实例启动一个新的、非提升的

powershell.exe -NoProfile
实例,但还没有找到一种方法来传递
-NoProfile
开关,从而导致使用自定义颜色/布局的控制台,通常在资源管理器窗口(例如蓝色 PowerShell 控制台窗口)中双击 powershell.exe 时使用。



从升高的主机/控制台降低高度的两种流行方法:

  1. runas.exe /trustlevel:0x20000 powershell.exe
    • 问题: 控制台窗口不使用通常显示的自定义布局/颜色,并且通常显示为黑色控制台窗口。
    • 有一个关于蓝色和黑色控制台之间差异的问题这里
    • Lee Holmes 也有一个关于此的简短博客

  2. 利用 explorer.exe(默认)较低的信任级别并执行以下操作:
    Start-Process $env:SystemRoot\explorer.exe $PSHome\powershell.exe
    • 问题:如果用户禁用了UAC,那么explorer.exe无论如何都会以海拔高度运行,因此这种方法不如使用
      runas.exe /trustlevel:0x20000 powershell.exe
      那么可靠




我已经尝试过:

  • runas.exe /trustlevel:0x20000 "powershell.exe -NoProfile"
    • 可以工作,但会打开一个黑色的控制台窗口。
  • runas.exe /trustlevel:0x20000 "explorer.exe powershell.exe -NoProfile"
    • 打开资源管理器窗口。
  • 使用
    [System.Diagnostics.Process]::new()
    [System.Diagnostics.ProcessStartInfo]::new()
    进行各种组合和重载,但没有成功。
  • 使用各种形式的
    start /b "" xyz
    但没有成功。



编辑注册表来修改默认控制台布局/颜色并非不可能,但这不是最实用的解决方案。 还有其他更好的方法吗?

windows powershell cmd start-process process-elevation
1个回答
1
投票
  • 控制台 (conhost.exe) 窗口的

    startup
    窗口标题决定要应用哪些设置,取自注册表项
    [HKEY_CURRENT_USER\Console\<transformed-exe-path>]
    ,其中
    <transformed-exe-path>
    是带有
    \
    的可执行文件的完整路径字符替换为
    _
    ,详见此答案

  • 使用

    runas.exe /trustlevel:0x20000
    ,您将获得一个自定义窗口标题,它总是附加以下内容到启动命令行:
    (running as <computer>\<user> with restricted privileges)
    - 并且因为这样的标题不太可能在
    [HKEY_CURRENT_USER\Console]
    中具有特定的子项,应用默认控制台设置。

解决此问题的最简单方法是通过

cmd /c start
调用以启动 new 窗口 - 要么依赖新窗口的目标可执行文件的路径来选择正确的设置,要么通过指定显式启动标题:

runas /trustlevel:0x20000 'cmd /c start powershell.exe -noprofile'

注:

  • 这将创建两个控制台窗口:一个用于cmd /c

    瞬态
    ,以及由
    start
    创建的目标窗口 - 希望瞬态窗口的持续时间太短,无法产生视觉影响。

  • 在 Windows 11 中,至少版本 22H2 之前,目前存在 a bug,它会阻止使用

    /trustlevel
    ,而无需为当前计算机提供
    /machine
    参数 architecture:

    runas "/machine:$($env:PROCESSOR_ARCHITECTURE.ToLower())" /trustlevel:0x20000 'cmd /c start powershell.exe -noprofile'
    
  • 如果您需要为

    start
    启动的进程指定显式窗口标题,事情会变得棘手,因为该标题必须被
    "..."
    括起来,这是由于长期存在的 PowerShell 在传递参数方面的错误嵌入
    "
    字符。到外部程序(参见这个答案) - 必须手动转义为
    \"
    ;例如,设置自定义标题
    Custom Title
    :

    # A solution that works in v7.3+ too
    & {
      $PSNativeCommandArgumentPassing = 'Legacy'
      # Note: /machine argument omitted for brevity.
      runas /trustlevel:0x20000 'cmd /c start \"Custom Title\" powershell.exe -noprofile'
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.