2011-09-30 45 views
8

Aquí está mi código:Para ejecutar cmd como administrador junto con el comando?

try 
{ 
    ProcessStartInfo procStartInfo = new ProcessStartInfo(
              "cmd.exe", 
              "/c " + command); 
    procStartInfo.UseShellExecute = true; 
    procStartInfo.CreateNoWindow = true; 
    procStartInfo.Verb = "runas"; 
    procStartInfo.Arguments = "/env /user:" + "Administrator" + " cmd" + command; 

    ///command contains the command to be executed in cmd 
    System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
    proc.StartInfo = procStartInfo; 
    proc.Start(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

quiero seguir

procStartInfo.UseShellExecute = true 
procStartInfo.RedirectStandardInput = false; 

¿Es posible ejecutar el comando sin usar process.standardinput? Intento ejecutar el comando He pasado el argumento pero el comando no se ejecuta.

+0

** Es posible ejecutar el comando sin usar process.standardinput? Intento ejecutar el comando He pasado el argumento pero el comando no se ejecuta. ** Actualmente no lo está usando, por lo que esta pregunta no tiene mucho sentido. Por favor, haga el favor de su usuario y permita que el símbolo del sistema sea visible, para que sepa qué está pasando. –

+1

Usted no quiere 'Verbo'. Eso no significa lo que piensas que significa. Creo. –

+0

@Ramhound procStartInfo.Arguments = "/ env/user:" + "Administrador" + "cmd" + ** comando **; – purvang

Respuesta

1

¿Por qué inicializa el objeto de proceso con argumentos y luego anula esos Argumentos? y por cierto: el último bit donde estableces Argumentos concatena 'comando' hasta 'cmd', eso no tiene mucho sentido y podría ser donde falla (parece que te falta un espacio).

Además, actualmente está utilizando la línea de comando estándar, en su lugar debería considerar usar the runas tool. también puede llamar a runas desde la línea de comando.

Además, ¿por qué está ejecutando 'comando' desde la línea de comandos? ¿por qué no iniciarlo directamente desde Process.Start con los privilegios de administrador proporcionados en ese momento? aquí hay un poco de pseudocódigo:

Process p = Process.Start(new ProcessStartInfo() 
{ 
    FileName = <your executable>, 
    Arguments = <any arguments>, 
    UserName = "Administrator", 
    Password = <password>, 
    UseShellExecute = false, 
    WorkingDirectory = <directory of your executable> 
}); 
+0

gracias por la idea, pero no sé cómo otorgar privilegios de administrador durante process.start.can ¿Puedes dar algún ejemplo de código o ejemplo? – purvang

+0

actualicé la respuesta con algún pseudocódigo – mtijn

5

Como @mtijn dijo que tienes muchas cosas que usted también está anulando después. También debes asegurarte de que estás escapando correctamente.

Digamos que desea ejecutar el siguiente comando elevado:

dir c:\ 

En primer lugar, si usted acaba de ejecutar este comando a través Process.Start() una ventana haría estallar abrir y cerrar de inmediato porque no hay nada para mantener la ventana abierta . Procesa el comando y sale. Para mantener la ventana abierta podemos envolver el comando en la ventana de comandos por separado y utilizar el interruptor /K para que siga funcionando:

cmd /K "dir c:\" 

Para ejecutar ese comando elevó podemos usar runas.exe igual que eras excepto que tenemos que escapar cosas un poco más Según los documentos de ayuda (runas /?), cualquier comilla en el comando que pasemos al runas debe escaparse con una barra diagonal inversa. Lamentablemente, hacer eso con el comando anterior nos da una doble barra diagonal inversa que confundió al analizador de cmd por lo que también debe escaparse. Por lo que el comando anterior va a terminar siendo:

cmd /K \"dir c:\\\" 

Finalmente, usando la sintaxis que ya ha proporcionado podemos envolver todo para arriba en un comando runas y adjuntar nuestro comando anterior en una nueva serie de citas:

runas /env /user:Administrator "cmd /K \"dir c:\\\"" 

Ejecute el comando anterior desde un símbolo del sistema para asegurarse de que funciona como se esperaba.

Teniendo en cuenta todo lo que el código final se vuelve más fácil de montar:

 //Assuming that we want to run the following command: 
     //dir c:\ 

     //The command that we want to run 
     string subCommand = @"dir"; 

     //The arguments to the command that we want to run 
     string subCommandArgs = @"c:\"; 

     //I am wrapping everything in a CMD /K command so that I can see the output and so that it stays up after executing 
     //Note: arguments in the sub command need to have their backslashes escaped which is taken care of below 
     string subCommandFinal = @"cmd /K \""" + subCommand.Replace(@"\", @"\\") + " " + subCommandArgs.Replace(@"\", @"\\") + @"\"""; 

     //Run the runas command directly 
     ProcessStartInfo procStartInfo = new ProcessStartInfo("runas.exe"); 
     procStartInfo.UseShellExecute = true; 
     procStartInfo.CreateNoWindow = true; 

     //Create our arguments 
     string finalArgs = @"/env /user:Administrator """ + subCommandFinal + @""""; 
     procStartInfo.Arguments = finalArgs; 

     //command contains the command to be executed in cmd 
     using (System.Diagnostics.Process proc = new System.Diagnostics.Process()) 
     { 
      proc.StartInfo = procStartInfo; 
      proc.Start(); 
     } 
+0

Ejecuté el siguiente comando sugerido en cmd runas/env/user: Administrador "cmd/K \" dir c: \\\ "" Solicita la contraseña incluso si ingreso una contraseña que falla da la siguiente salida No se puede ejecutar cmd/k "dir c: \" – purvang

+0

¿Ejecutaste 'runas/env/user: Administrator" cmd/K \ "dir c: \\\" "' o 'cmd runas/env/usuario: Administrador "cmd/K \" dir c: \\\ "" '? El primero es lo que deberías haber corrido. –

+0

Lo ejecuto como runas/env/usuario: Administrador "cmd/K \" dir c: \\\ "" pero da error de la siguiente manera No se puede ejecutar cmd/k "dir c: \" – purvang

Cuestiones relacionadas