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();
}
** 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. –
Usted no quiere 'Verbo'. Eso no significa lo que piensas que significa. Creo. –
@Ramhound procStartInfo.Arguments = "/ env/user:" + "Administrador" + "cmd" + ** comando **; – purvang