PowerShell — запустить другой экземпляр PowerShell.exe без повышения прав и с помощью параметра -NoProfile.
Я пытаюсь запустить новый экземпляр powershell.exe (из PowerShell/ISE/pwsh/VSCode) с пониженной высотой, используя его переключатель, но не нашел способ передать-NoProfile
переключиться таким образом, что в результате появится новая консоль PowerShell без повышенных прав, которая использует пользовательские цвета/макет, которые обычно используются при двойном щелчке powershell.exe из окна проводника.
Кажется, есть два довольно распространенных подхода к снижению высоты с повышенного хоста/консоли:
- С использованием
- Воспользуйтесь более низким уровнем доверия explorer.exe (по умолчанию) и сделайте что-то вроде этого:
Start-Process $env:SystemRoot\explorer.exe $PSHome\powershell.exe
- Если пользователь отключил UAC, то explorer.exe все равно будет работать с повышенными правами, поэтому этот метод не так надежен, как использование
runas.exe /trustlevel:0x20000 powershell.exe
- Если пользователь отключил UAC, то explorer.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' }