2009-10-14 8 views
14

Ho uno script PowerShell semplice per fermare un processo:Mostrando il prompt UAC in PowerShell se l'azione richiede l'elevazione

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

Se provo a fermare un processo non avviato dall'utente corrente; funziona su Windows Server 2003. Tuttavia, in Windows Server 2008 (e altri sapori di Windows con User Account Control), ottengo il seguente errore:

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

C'è un modo per aggirare questo senza correre PowerShell con elevata privilegi? Sarebbe OK se l'utente fosse appena presentato con il prompt UAC, ogni volta che tenta di eseguire un'azione, che richiede l'elevazione.

risposta

17

AFAIK, non c'è modo di farlo nel senso che sembra che tu voglia. Questo è in esecuzione un .exe specificato e si aspetta che venga visualizzato immediatamente un prompt.

Quello che faccio è per i comandi che conosco devono essere eseguiti con privilegi amministrativi, li eseguo con le funzioni che ho definito chiamata Invoke-Admin. Assicura che sto funzionando come admin e chiederà all'utente la finestra di dialogo UAC se non lo sono prima di eseguire il comando.

Qui è

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

destro , come mettere l'output standard & errore di uscita nel corrente flusso di comando? –

+0

È qualcosa del genere in pscx? In caso contrario, potresti aggiungerlo? –

0

Questo script sectio verificare il token di livello obbligatorio medio (non elevata admin) e riavvia lo script elevato.

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

prima cosa installare PowerShell Community Extensionschoco install pscx via Chocolatey (potrebbe essere necessario riavviare il vostro ambiente di shell)

quindi attivare pscx

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

Quindi utilizzare Invoke-Elevated, ad esempio

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

Dove diavolo hai trovato "Invoke-Elevated". Non esiste un comando del genere a meno che non si tratti di una funzione che hai scritto. Ho sbagliato? – Habanagold

+0

Hai installato e abilitato PSCX? che fa parte di PSCX, vedi http://stackoverflow.com/a/8703862/1689770 –

+0

grazie, appena digitato Install-Package -Nome pscx -Source psgallery e funziona! sarebbe solo più bello se non si accende una console diversa ma eleva la console corrente, comunque penso che questo è qualcosa che dipende da come Windows gestisce i processi .... –

Problemi correlati