visual studio ejecutar desde comandos cerrar bat abrir c# .net command-line process privileges

c# - studio - ¿Para ejecutar cmd como administrador junto con el comando?



ejecutar openssl desde c# (2)

¿Por qué inicializas el objeto de proceso con argumentos y luego anulas 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, es posible que desee examinar el uso de la herramienta runas en su lugar. también puede llamar a runas desde la línea de comando.

Además, ¿por qué estás ejecutando ''comando'' desde la línea de comando? ¿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> });

Aquí está mi código:

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 guardar

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.


Como @mtijn dijo que tienes muchas cosas en juego que también anulas más tarde. También debes asegurarte de que estás escapando correctamente.

Supongamos que desea ejecutar el siguiente comando elevado:

dir c:/

Primero, si acaba de ejecutar este comando a través de Process.Start() una ventana se 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 una ventana de comandos separada y usar el /K para mantenerlo en ejecución:

cmd /K "dir c:/"

Para ejecutar ese comando elevado podemos usar runas.exe tal como estaba, excepto que necesitamos escapar de las cosas un poco más. Según los documentos de ayuda ( runas /? ), Cualquier comilla en el comando que pasemos a los runas debe ser escapada 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. Entonces el comando anterior terminará siendo:

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

Finalmente, usando la sintaxis que proporcionó podemos envolver todo en un comando runas y adjuntar nuestro comando anterior en un conjunto adicional de comillas:

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.

Dado todo lo que el código final se vuelve más fácil de ensamblar:

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