2009-10-14 10 views
14

Tengo un simple script de PowerShell para detener un proceso:Mostrando el mensaje de UAC en PowerShell si la acción requiere la elevación

$p = get-process $args 
if ($p -ne $null) 
{ 
$p | stop-process 
$p | select ProcessName, ID, HasExited, CPU, Handles 
} 
else { "No such process" } 

Si trato de detener un proceso no iniciado por el usuario actual; funciona en Windows Server 2003. Sin embargo, en Windows Server 2008 (y otros sabores de Windows con el Control de cuentas de usuario), me sale el siguiente error:

Stop-Process : Cannot stop process "w3wp (5312)" because of the following error: Access is denied 

¿Hay alguna forma de evitar esto sin correr PowerShell con elevada privilegios? Sería correcto si al usuario se le acaba de presentar el aviso UAC, cada vez que intenta ejecutar una acción, que requiere elevación.

Respuesta

17

AFAIK, no hay forma de hacerlo en el sentido en que usted parece querer. Eso está ejecutando un .exe especificado y esperando que aparezca un aviso inmediatamente.

Lo que hago es para los comandos que sé que deben ejecutarse con privs administrativos, los ejecuto con una función que tengo llamada Invoke-Admin. Asegura que me estoy ejecutando como administrador e indico al usuario con el cuadro de diálogo UAC si no estoy antes de ejecutar el comando.

Aquí se

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(); 
    } 
} 
+0

Derecho , cómo poner salida estándar y error de salida en el flujo de solicitud de comando actual? –

+0

¿Hay algo como esto en pscx? Si no, ¿podrías agregarlo? –

0

Este script secció comprobar la señal de nivel de Mandatory Medium (no elevada admin) y reinicia la secuencia de comandos elevada.

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 
} 
3

Primero instale PowerShell Community Extensionschoco install pscx través Chocolatey (es posible que tenga que reiniciar el entorno de shell)

a continuación, active pscx

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser #allows scripts to run from the interwebs, such as pcsx 

A continuación, utilice Invoke-Elevated, por ejemplo

Invoke-Elevated {Add-PathVariable $args[0] -Target Machine} -ArgumentList $MY_NEW_DIR 
+0

¿Dónde diablos encontró "Invocar-Elevado". No existe dicho comando a menos que sea una función que haya escrito. ¿Me equivoco? – Habanagold

+0

¿Instaló y habilitó PSCX? eso es parte de PSCX, ver http://stackoverflow.com/a/8703862/1689770 –

+0

gracias, simplemente tipeado Install-Package -Name pscx-Source psgallery y funciona! Sería mucho mejor si no se dispara una consola diferente, pero eleva la consola actual, de todos modos, creo que esto es algo que depende de cómo maneja Windows los procesos ... –

Cuestiones relacionadas