PowerShell — запустить другой экземпляр PowerShell.exe без повышения прав и с помощью параметра -NoProfile.

Я пытаюсь запустить новый экземпляр powershell.exe (из PowerShell/ISE/pwsh/VSCode) с пониженной высотой, используя его переключатель, но не нашел способ передать-NoProfileпереключиться таким образом, что в результате появится новая консоль PowerShell без повышенных прав, которая использует пользовательские цвета/макет, которые обычно используются при двойном щелчке powershell.exe из окна проводника.


Кажется, есть два довольно распространенных подхода к снижению высоты с повышенного хоста/консоли:

  1. С использованием
    • Окно консоли не использует пользовательский макет/цвета, с которыми оно обычно отображается, и обычно отображается как черное окно консоли.
      • Тут ТАК вопрос по отличиям синей и черной консолей .
      • У Ли Холмса также есть короткий блог об этом.
  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безуспешно.

Есть ли другой подход, который будет работать лучше? Редактирование реестра для установки макета/цвета консоли по умолчанию не является невозможным, но это не самое идеальное или надежное решение.

1 ответ

  • Это заголовок окна запуска консоли (conhost.exe) окно, определяющее, какие параметры применить, взятые из ключа реестра[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чтобы запустить новое окно - либо полагаясь на путь целевого исполняемого файла нового окна, чтобы выбрать правильные настройки, либо указав явный заголовок запуска:

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

Примечание:

  • Это создаст два окна консоли: временное дляcmd /c, и целевой, созданный - надеюсь, переходный будет слишком недолговечным, чтобы иметь визуальное воздействие.

  • В Windows 11, по крайней мере, до версии 22H2 в настоящее время существует ошибка , которая не позволяет использовать/trustlevelне предоставляя также/machineаргумент с текущей архитектурой машины :

            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'
    }
    
Другие вопросы по тегам