Отображение приглашения UAC в PowerShell, если действие требует повышения
У меня есть простой PowerShell script, чтобы остановить процесс:
$p = get-process $args
if ( $p -ne $null )
{
$p | stop-process
$p | select ProcessName, ID, HasExited, CPU, Handles
}
else { "No such process" }
Если я попытаюсь остановить процесс, не запущенный текущим пользователем; он работает на Windows Server 2003. Тем не менее, в Windows Server 2008 (и других средствах Windows с контролем учетных записей пользователей) я получаю следующую ошибку:
Stop-Process : Cannot stop process "w3wp (5312)" because of the following error: Access is denied
Есть ли способ обойти это без запуска PowerShell с повышенными привилегиями? Было бы хорошо, если бы пользователь был просто представлен приглашением UAC, когда он пытался выполнить действие, требующее повышения.
Ответы
Ответ 1
AFAIK, нет способа сделать это в том смысле, в котором вы, похоже, хотите. Это работает с указанным .exe и ожидает немедленного появления подсказки.
Что я делаю для команд, которые, как мне известно, должны запускаться с административными привилегиями, я запускаю их с функциями, которые я кладу вокруг Invoke-Admin. Это гарантирует, что я запускаю как admin и подскажу пользователю с диалоговым окном UAC, если я не выполняю команду.
Здесь
function Invoke-Admin() {
param ( [string]$program = $(throw "Please specify a program" ),
[string]$argumentString = "",
[switch]$waitForExit )
$psi = new-object "Diagnostics.ProcessStartInfo"
$psi.FileName = $program
$psi.Arguments = $argumentString
$psi.Verb = "runas"
$proc = [Diagnostics.Process]::Start($psi)
if ( $waitForExit ) {
$proc.WaitForExit();
}
}
Ответ 2
Сначала установите Расширения сообщества PowerShell choco install pscx
через Chocolatey (возможно, вам придется перезапустить среду оболочки)
затем включите pscx
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser #allows scripts to run from the interwebs, such as pcsx
Затем используйте Invoke-Elevated
, например
Invoke-Elevated {Add-PathVariable $args[0] -Target Machine} -ArgumentList $MY_NEW_DIR
Ответ 3
Эта проверка script для маркера уровня среднего обязательного уровня (не повышенный админ) и перезапускает script повышенную.
if ($Mygroups -match ".*Mandatory Label\\Medium Mandatory Level") {
#non elevated admin: elevating
write-host "Elevate"
start-process powershell -Argumentlist "$PSCommandPath -Yourargument $Youragumentvalue" -verb runas -Wait
exit
}