2011-12-31 19 views
5

Estoy intentando ejecutar un comando cmd con el siguiente código:Ejecutar proceso de elevado

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()); 

Este comando requiere privelages de administrador, si me quedo cmd como administrador y escriba el comando funciona perfectamente, pero no cuando corro esta aplicación como administrador. He añadido

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

a un archivo de manifiesto la cual UAC cada vez que abro el exe.

He visto varias preguntas al respecto y todas parecen sugerir que cualquier proceso ejecutado bajo una aplicación elevada tendrá los mismos derechos, pero esto no funciona para mí.

He intentado cmd.Verb = "runas"; pero no hay dados.

+0

Intente cambiar '' true' cmd.UseShellExecute' y mantener el verbo 'runas'. – keyboardP

+0

Acabo de probarlo pero obtuve este error 'El objeto Process debe tener la propiedad UseShellExecute establecida en false para redirigir las secuencias IOs.' Gracias. –

+4

Ahí es donde se detiene el dinero, no se puede tener en ambos sentidos. El UAC evita que un proceso no elevado descuelgue las capacidades de uno elevado. La única forma en que puedes redirigir es elevarte primero. –

Respuesta

13

Es necesario configurar UseShellExecute a true para la Verb ser respetados y que se debe establecer en 'falso' para redirigir la salida estándar. No puedes hacer ambas cosas.

Estoy seguro de que Windows tampoco le permitirá redirigir la entrada/salida/error estándar a través del límite de seguridad admin/non-admin. Deberá encontrar una forma diferente de obtener resultados del programa que se ejecuta como administrador.

no haber leído este artículo, pero esto puede darle más información: http://www.codeproject.com/KB/vista-security/UAC__The_Definitive_Guide.aspx

+0

Intento usar UseShellExecute = false; Verbo = "runas"; RedirectStandardInput = verdadero; Dominio = du [0]; UserName = UserAdministrator; Contraseña = SecureStringHelper.ToSecureString (pwd); LoadUserProfile = true; Y usando requestedExecutionLevel en manifiesto. Si uso UseShellExecute = true; Obtengo el error El objeto Proceso debe tener la propiedad UseShellExecute establecida en falso para iniciar un proceso como usuario. – Kiquenet

+0

Muestra completa de manera diferente para obtener la salida del programa que se ejecuta como administrador? – Kiquenet

2

¿Intentó asignar credenciales administrativas a su objeto ProcessStartInfo?

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

No puedo hacer esto porque necesito el UAC para solicitarlos, ya que se usarán en varias PC, gracias. –

+0

De acuerdo, tiene sentido. ¿Puedes decirme por qué estás creando un proceso de comando y ordenándolo ejecutar "sc" en lugar de ejecutar el comando "sc" directamente? – Abbas

+0

Estoy tratando de ejecutar el comando sc a través de un botón en un formulario de win ya que el usuario no sabrá cómo usar sc, solo para que sea más fácil para ellos usar el programa. –

Cuestiones relacionadas