Отображение приглашения 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
}