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

17

我有一个简单的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个回答

21
据我所知,以你期望的方式没有办法做到。即运行指定的.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();
    }
}

如何将标准输出和错误输出放入当前命令提示符流中? - MUY Belgium
在PSCX中有类似这样的东西吗?如果没有,您能添加它吗? - Jonathan

3

首先安装PowerShell社区扩展,通过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

你到底在哪里找到了“Invoke-Elevated”?除非这是你编写的函数,否则没有这样的命令。我错了吗? - Habanagold
你安装并启用了PSCX吗?它是PSCX的一部分,请参见http://stackoverflow.com/a/8703862/1689770。 - Jonathan
谢谢,我刚刚输入了“Install-Package -Name pscx -Source psgallery”,它可以工作!如果它不会启动一个不同的控制台而是提升当前控制台,那就更好了。无论如何,我认为这取决于Windows如何管理进程... - Mosè Bottacini

-1

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

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
}

$myGroups来自哪里? - swe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接