Как правило, для программного запуска исполняемого файла с повышением прав (Запуск от имени администратора) в Windows используйте командлет Start-Process
с -Verb RunAs
.
Это в равной степени относится к pwsh.exe
исполняемый файл PowerShell Core , поэтому в простейшем случае вы можете написать:
# Open a new console window with PowerShell Core running with admin privileges.
Start-Process -Verb RunAs pwsh
Если вы хотите обернуть это в вспомогательную функцию это также более надежно и кросс-издание в Windows (также работает в Windows PowerShell):
function Enter-AdminPSSession {
Start-Process -Verb RunAs (Get-Process -Id $PID).Path
}
# Optionally also define a short alias name:
# Note: 'psadmin' is a nonstandard alias name; a more conformant name would be
# the somewhat clunky 'etasn'
# ('et' for 'Enter', 'a' for admin, and 'sn'` for session)
Set-Alias psadmin Enter-AdminPSSession
Если вы хотите, чтобы функция также была кроссплатформенный (также для работы на Unix-подобных платформах):
function Enter-AdminPSSession {
if ($env:OS -eq 'Windows_NT') {
Start-Process -Verb RunAs (Get-Process -Id $PID).Path
} else {
sudo (Get-Process -Id $PID).Path
}
}
Важно : из-за задействованных командлетов / утилит
в Windows , новый сеанс неизменно открывается в новом окне консоли.
- Тот факт, что новый сеанс является сеансом администратораотображается в заголовке окна (префикс
Administrator:
)
в Unix (Linux, macOS)новый сеанс неизменно открывается в том же окне консоли (терминала).
- В Unix нет очевидного индикатора того, что сеанс администратора был введен;запуск
whoami
- быстрый способ проверить это (возвращает root
в сеансе администратора);Лучшим решением было бы изменить функцию prompt
, чтобы она отражала сеанс администратора в строке приглашения.
Если вам дополнительно нужна возможностьЗапустите команды в новом сеансе и, при необходимости, автоматически закройте его , потребуется гораздо больше работы.
Если вы скачаете скрипт Enter-AdminPSSession.ps1
(Gist с лицензией MIT), выможет запускать такие команды, как:
# Example: Synchronously run an MSI installer with elevation
# and exit on completion.
Enter-AdminPSSession -Exit { Start-Process msiexec -Args '/qn /i package.msi' }
# Check for success via $LASTEXITCODE
if ($LASTEXITCODE -ne 0) { Throw "Installation failed." }
Кроме того, сценарий:
префикс строки приглашения в интерактивных сеансах с повышенными привилегиями с [admin]
гарантирует, что текущее местоположение вызывающего сеанса (рабочий каталог) также является текущим местоположением повышенного сеанса.