如果操作需要提升,则在PowerShell中显示UAC提示

时间:2009-10-14 15:12:52

标签: powershell uac

我有一个简单的PowerShell脚本来停止进程:

$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提示,那就没问题了。

3 个答案:

答案 0 :(得分:17)

AFAIK,在你似乎想要的意义上没有办法做到这一点。这是运行指定的.exe并期望立即出现提示。

我所做的是对于我知道必须使用管理权限运行的命令,我使用我称之为Invoke-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();
    }
}

答案 1 :(得分:3)

首先通过PowerShell Community Extensions安装Chocolatey choco install pscx(您可能需要重新启动shell环境)

然后启用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

答案 2 :(得分:0)

此脚本会检查中等强制级别令牌(非提升管理员)并重新启动提升的脚本。

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
}