2009-07-23 17 views
24

So come lanciare un processo con privilegi di amministratore da un processo utilizzando:Come si de-elevare i privilegi di un processo figlio

proc.StartInfo.UseShellExecute = true; 
proc.StartInfo.Verb = "runas"; 

dove proc è uno System.Diagnostics.Process. Ma come si fa il contrario?

Se il processo in cui ci si trova è già elevato, come si avvia il nuovo processo senza privilegi di amministratore? Più precisamente, abbiamo bisogno di avviare il nuovo processo con lo stesso livello di autorizzazione di Windows Explorer, quindi nessuna modifica se UAC è disabilitato, ma se UAC è abilitato, ma il nostro processo è in esecuzione elevato, dobbiamo eseguire una determinata operazione senza elevazione perché stiamo creando un disco virtuale e se è stato creato con autorizzazioni elevate e Windows Explorer è in esecuzione non superiore non verrà visualizzato.

Sentiti libero di cambiare il titolo in qualcosa di meglio, non ho potuto trovare una buona descrizione.

+3

stessa domanda: http://stackoverflow.com/questions/196949/how-to-run-not-elevated-in-vista-net La risposta sembra spaventosa h. – weiqure

+3

Non solo è spaventoso, non è corretto. L'elevazione UAC è unidirezionale e non esiste un modo documentato per tornare indietro (effettuare l'iniezione in explorer.exe o utilizzare l'Utilità di pianificazione è un po 'hacky e probabilmente non è una buona idea) – Anders

risposta

8

Abbiamo finito per usare l'esempio da questo articolo Codice Progetto: High elevation can be bad for your application: How to start a non-elevated process at the end of the installation

Sembra funzionare finora, mi sembra di capire che inietta nella RunDll32.exe, il mio C++/Win32 è piuttosto debole così ho didn Guardare troppo all'attuazione reale, solo che è utile. Confermato che funziona in Vista e Win7 sia x86 che x64 (almeno per noi, x86 e x64 richiedono dll diversi che vengono controllati al momento dell'installazione e viene usato quello corretto).

0

È possibile utilizzare ProcessStartInfo.UserName e ProcessStartInfo.Password per specificare l'account in cui si desidera eseguire il processo.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var psi = new ProcessStartInfo(@"c:\windows\system32\whoami.exe"); 
     var password = new SecureString(); 
     password.AppendChar('s'); 
     password.AppendChar('e'); 
     password.AppendChar('c'); 
     password.AppendChar('r'); 
     password.AppendChar('e'); 
     password.AppendChar('t'); 
     psi.Password = password; 
     psi.UserName = "username"; 
     psi.UseShellExecute = false; 
     psi.RedirectStandardOutput = true; 

     var p = new Process(); 
     p.StartInfo = psi; 
     p.Start(); 
     p.WaitForExit(); 

     Console.WriteLine(p.StandardOutput.ReadToEnd()); 
    } 
} 
+12

Come faresti se il nome utente/password è sconosciuto? Ha bisogno di lavorare per qualsiasi macchina sconosciuta – Davy8

15

La soluzione per voi è utilizzare il processo EXPLORER.exe.

L'idea è di eseguire il processo in modalità UN-ELEVATED, utilizzando il processo di esplorazione file di Windows explorer.exe (info). Diciamo che il processo che vogliamo avviare è $TEMP\MyUnElevatedProcess.exe.

Quindi, per il codice NSIS, mi limiterò a scrivere: (ma può essere eseguito in qualsiasi lingua)

Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"' 

codice di esempio (usando NSIS installer)

Exec '"$WINDIR\explorer.exe" "$TEMP\MyUnElevatedProcess.exe"' 

*** codice preso da http://mdb-blog.blogspot.com/2013/01/nsis-lunch-program-as-user-from-uac.html

+1

Questa è una delle migliori risposte che ho visto per avviare un processo non previsto ... purtroppo, non posso usarlo perché non riesco a catturare lo stdout o lo stderr di MyUnElevatedProcess.exe. – Kenn

+2

Sto provando ad utilizzare questa soluzione, ma l'applicazione gira sotto la cartella Windir invece della cartella Temp..una soluzione per questo? (ovvero i file sono relativi alla cartella windir) – sebas

+1

Per utilizzare questo comando per la casella di controllo nella pagina finale in un programma di installazione dell'interfaccia utente moderna, utilizzare due righe. Prima riga: '! Define MUI_FINISHPAGE_RUN" $ WINDIR \ explorer.exe "' e seconda riga: '! Define MUI_FINISHPAGE_RUN_PARAMETERS" $ TEMP \ MyUnElevatedProcess.exe "'. –

Problemi correlati