2011-01-28 20 views
7

Estoy tratando de ejecutar un comando a través del símbolo del sistema desde una aplicación web ASP.Net. Puedo ver que el proceso comienza en el administrador de tareas en el servidor web, sin embargo, el proceso simplemente se queda allí y nunca sale ni ejecuta los comandos que especifiqué.¿Por qué el comando "cmd.exe/C" no finaliza cuando se llama a través de Process.Start()?

  Process process = new Process(); 
      ProcessStartInfo startInfo = new ProcessStartInfo(); 

      startInfo.FileName = "cmd.exe"; 
      startInfo.Arguments = "/C " +command; 
      startInfo.UserName = "myuser"; 
      startInfo.UseShellExecute = false; 
      startInfo.RedirectStandardOutput = true; 
      startInfo.Domain = "mydomain"; 
      startInfo.CreateNoWindow = true; 

      String pass = "mypass"; 
      System.Security.SecureString secPass = new System.Security.SecureString(); 

      foreach (char c in pass.ToCharArray()) 
      { 
       secPass.AppendChar(c); 
      } 
      secPass.MakeReadOnly(); 

      startInfo.Password = secPass; 

      process.StartInfo = startInfo; 
      process.Start(); 
      //output = process.StandardOutput.ReadToEnd(); 
      process.WaitForExit(); 
      process.Close(); 

He intentado tanto con como sin leer la salida estándar.

La aplicación se bloqueará en process.WaitForExit(); hasta que elimine el proceso a través del administrador de tareas.

+2

Si lo intenta leyendo la salida estándar, ¿ha mirado cuál es la salida estándar? Intenta leer el error estándar también; es posible que recibas algún tipo de mensaje de error, tal vez uno que incluso dice "Presiona cualquier tecla para continuar ..." o algo por el estilo. – GWLlosa

+0

@GWLlosa, tanto la salida estándar como el error estándar están vacíos. Pensé en eso "Empuje cualquier tecla ...", así que intenté escribir un carácter en la entrada estándar, pero todavía nada. –

+2

¿Por qué ejecutarlo a través de cmd? ¿Por qué no simplemente ejecutarlo directamente? –

Respuesta

2

Creo que tenemos que entender los comandos que realmente está tratando de procesar el fin de determinar lo que está pasando. También necesitamos saber qué sistema operativo está ejecutando el servidor.

Por ejemplo, vi en sus comentarios donde intentó "echo test> C: \ test.txt" En Windows Server 2008 (y Windows 7), el directorio raíz requiere permisos de administrador para crear archivos. Si esto se está ejecutando bajo IIS, supongo que su usuario de IIS no es un administrador y usted está recibiendo excepciones de seguridad.

Además, una serie de comandos puede requerir privilegios elevados debido a UAC. No recuerdo exactamente, pero supongo que si esos comandos están siendo detectados por UAC, entonces el proceso está esperando la confirmación de UAC ... Lo que I cree que no puede suministrar a través de una línea de comando.

Este tipo de problema no se verá si inicia sesión en la máquina y lo ejecuta directamente ... a menos que esté iniciando sesión con la cuenta de usuario del proceso de trabajo.

Por lo tanto, lo primero que debe hacer es averiguar qué es lo que está tratando de ejecutar y ver si el usuario que ejecuta el proceso de trabajo puede incluso realizar esas acciones. La seguridad está ahí para protegerlo, así que tenga cuidado de otorgar permisos adicionales al usuario.

La razón por la que podría funcionar en una máquina frente a otra depende del sistema operativo que esas máquinas estén ejecutando y de la configuración del usuario bajo el cual se ejecutan los comandos.

Si esto es realmente un problema de seguridad, como sospecho, entonces debe publicar una pregunta en serverfault.com para preguntar qué conjuntos de permisos necesita para ejecutar varios comandos en su usuario de proceso de trabajo.

Puede consultar los registros de eventos de las máquinas para ver si se emitieron advertencias o errores sobre el comando. A veces, estas cosas pueden aparecer allí para darle un poco más de información sobre lo que sucedió.

+0

Wow. Acabo de ver qué tan vieja es esta pregunta ... Uy. – NotMe

+0

No me importa, gracias por su aporte. Lo había olvidado en realidad. Fue un problema de permisos. –

1

Una vez que se pasa a CMD, el control pasa al shell. Es mejor añadir una estrecha así:

private void closeSubProcess() 
    { 
     Process[] currentProcesses = Process.GetProcesses(); 
     foreach (Process p in currentProcesses) 
     { 
      string s = p.ProcessName; 
      s = s.ToLower(); 
      if (s.CompareTo("YOURPROGRAMNAMEHERE") == 0) 
      { 
       p.CloseMainWindow(); 
       p.Close(); 
      } 
     } 
    } 
+1

Es probable que el resultado sea cerrar el proceso antes de que haya hecho lo que se supone que debe hacer. – andynormancx

+0

Es cierto que necesitaría hacer un archivo o actualizar algo para contarle a la parte de .NET que está hecho y luego dispararlo. – jschorr

0

Llamo a cmd.exe para iniciar un módulo de nodo en Windows. npm obviamente debe ser instalado primero, junto con el módulo de nodo que necesito, y luego puedo llamar al módulo con argumentos en C#. El problema era que el cmd.exe no se apagaba, tenía que usar Task Mgr (¡igual que esta pregunta!).

 //This requires npm, and the module installed by npm... 
     ProcessStartInfo psi = new ProcessStartInfo(); 
     psi.FileName = "cmd.exe"; 
     psi.WindowStyle = ProcessWindowStyle.Hidden; 
     psi.UseShellExecute = true; //closes command window 
     psi.Arguments = "/c <nodemodulename>" + file1 + ".txt " + file2 + ".log"; 
     Process p = Process.Start(psi); 
     p.Close(); 

El argumento /c fue clave para el cierre de cmd.exe. Cuando comencé, había puesto el argumento /K, que mantiene funcionando a la maldita cosa. Resuelto Espero que esto ayude.(Esto es como antiguo, pero siempre lo olvidamos)

+0

(me doy cuenta de que la pregunta original tenía el argumento/c, pero pensé que sería bueno ofrecer esto de todos modos (/ K vs/c). Te deseo lo mejor. –

Cuestiones relacionadas