2011-12-31 12 views
5

Sto cercando di eseguire un comando cmd con il seguente codice:Run elevato processo

ProcessStartInfo cmd = new ProcessStartInfo("cmd.exe"); 
cmd.RedirectStandardInput = true; 
cmd.RedirectStandardOutput = true; 
cmd.RedirectStandardError = true; 
cmd.UseShellExecute = false; 
cmd.CreateNoWindow = true; 
cmd.WindowStyle = ProcessWindowStyle.Hidden; 
Process exec = Process.Start(cmd); 
exec.StandardInput.WriteLine("sc create \"BaliService\" binPath= \"{0}\\BaliService.exe\"", Directory.GetCurrentDirectory()); 

Questo comando richiede privelages di amministrazione, se corro cmd come amministratore e digitare il comando funziona perfettamente ma non quando corro questa app come amministratore. Ho aggiunto

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

ad un file manifesto che UAC ogni volta che apro il file EXE.

Ho visto più domande su questo e sembrano suggerire che tutti i processi eseguiti con un'app elevata avranno gli stessi diritti ma questo non funziona per me.

Ho provato cmd.Verb = "runas"; ma nessun dado.

+0

Provare a cambiare cmd.UseShellExecute' a 'true'' e mantenere il verbo 'runas'. – keyboardP

+0

Ho appena provato, ma ho ricevuto questo errore 'L'oggetto Processo deve avere la proprietà UseShellExecute impostata su false per poter reindirizzare i flussi IO. Grazie. –

+4

Ecco dove si ferma il dollaro, non puoi averlo in entrambe le direzioni. UAC impedisce a un processo non elevato di sfruttare le capacità di un livello elevato. L'unico modo per reindirizzare è elevare te stesso per primo. –

risposta

13

è necessario impostare UseShellExecute al true per il Verb da rispettare e deve essere impostato su 'false' per reindirizzare lo standard output. Non puoi fare entrambe le cose.

Sono abbastanza sicuro che Windows non consentirà di reindirizzare lo standard input/output/error attraverso il limite di sicurezza di admin/non admin. Dovrai trovare un modo diverso per ottenere l'output dal programma in esecuzione come amministratore.

non ho letto questo articolo, ma questo potrebbe darvi ulteriori informazioni: http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx

+0

Provo a utilizzare UseShellExecute = false; Verb = "runas"; RedirectStandardInput = true; Dominio = du [0]; UserName = UserAdministrator; Password = SecureStringHelper.ToSecureString (pwd); LoadUserProfile = true; E utilizzando requestExecutionLevel in manifest. Se uso UseShellExecute = true; Ottengo l'errore L'oggetto Process deve avere la proprietà UseShellExecute impostata su false per poter avviare un processo come utente. – Kiquenet

+0

Esempio completo di metodo diverso per ottenere l'output dal programma in esecuzione come amministratore? – Kiquenet

2

Hai provato ad assegnare credenziali amministrative all'oggetto ProcessStartInfo?

SecureString password = new SecureString(); 
password.AppendChar('p'); 
password.AppendChar('w'); 
cmd.UserName = "admin"; 
cmd.Password = password; 
+0

Non riesco a farlo perché ho bisogno di UAC per richiederli poiché verrà utilizzato su più PC, grazie. –

+0

Ok, ha senso. Puoi dirmi perché stai creando una procedura di comando e indirizzandola per eseguire "sc" piuttosto che eseguire il comando "sc" direttamente? – Abbas

+0

Sto provando a eseguire il comando sc tramite un pulsante su una winform in quanto l'utente non saprà come usare sc, solo per rendere più semplice l'uso del programma. –