2011-01-28 18 views
7

Sto provando a eseguire un comando tramite prompt dei comandi da un'applicazione Web ASP.Net. Riesco a vedere l'avvio del processo in Task Manager sul server Web, tuttavia il processo rimane solo lì e non esce mai né esegue i comandi che ho specificato.Perché il comando "cmd.exe/C" non viene terminato quando viene chiamato tramite 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(); 

Ho provato entrambi con e senza leggere lo standard output.

L'applicazione si bloccherà su process.WaitForExit(); finché non avrò terminato il processo tramite il task manager.

+2

Se provi a leggere l'output standard, hai guardato che cos'è lo standard output? Prova a leggere anche l'errore standard; potresti ricevere una sorta di messaggio di errore, forse uno che dice "Premi qualsiasi tasto per continuare ..." o qualcosa del genere. – GWLlosa

+0

@ GWLlosa, sia l'output standard che l'errore standard sono vuoti. Ho pensato a "Premi qualsiasi tasto ..." così ho provato a scrivere un carattere sullo standard input, ma ancora niente. –

+2

Perché eseguirlo tramite cmd? Perché non eseguirlo direttamente? –

risposta

2

Penso che abbiamo bisogno di capire che cosa comandi in realtà si sta tentando di elaborare al fine di determinare che cosa sta succedendo. Inoltre abbiamo bisogno di sapere quale sistema operativo è in esecuzione il server.

Ad esempio, ho visto nei commenti dove hai provato "echo test> C: \ test.txt" In Windows Server 2008 (e Windows 7) la directory root richiede le autorizzazioni di amministratore per creare file. Se questo è in esecuzione in IIS, la mia ipotesi è che il tuo utente IIS non sia un amministratore e si ottengano eccezioni di sicurezza.

Inoltre, un numero di comandi potrebbe richiedere privilegi elevati a causa di UAC. Non ricordo esattamente, ma suppongo che se tali comandi vengono catturati da UAC, il processo è in attesa di conferma UAC ... Quale I non è possibile fornire tramite una riga di comando.

Questo tipo di problema non verrà visualizzato se si accede alla macchina ed è eseguita direttamente ... a meno che non si stia effettuando l'accesso con l'account utente del processo di lavoro.

Quindi, la prima cosa che devi fare è capire che cosa stai cercando di eseguire e vedere se l'utente in cui il processo di lavoro sta eseguendo può anche eseguire quelle azioni. La sicurezza è lì per proteggerti, quindi fai attenzione a concedere permessi aggiuntivi all'utente.

Il motivo per cui potrebbe funzionare su una macchina rispetto a un'altra dipende dal sistema operativo in cui tali macchine sono in esecuzione e dalla configurazione dell'utente in esecuzione.

Se questo è veramente un problema di sicurezza, come sospetto, è necessario inserire una domanda su serverfault.com per chiedere quali set di autorizzazioni è necessario per eseguire vari comandi sotto l'utente del processo di lavoro.

È possibile controllare i registri eventi delle macchine per verificare se sono presenti avvisi o errori relativi al comando. A volte cose come questa possono apparire lì per darti qualche informazione in più su cosa è successo.

+0

Wow. Ho appena visto quanti anni ha questa domanda ... oops. – NotMe

+0

Non mi dispiace, grazie per il vostro contributo. Ne avevo dimenticato davvero. Era un problema di permessi. –

1

Una volta passato a CMD, il controllo è passato alla shell. E 'meglio aggiungere uno stretto in questo modo:

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

È probabile che ciò comporterà la chiusura del processo prima che abbia fatto qualsiasi cosa si suppone stia facendo. – andynormancx

+0

È vero, è necessario creare un file o aggiornare qualcosa per comunicare alla parte .NET che è stata eseguita e quindi attivarla. – jschorr

0

Sto chiamando cmd.exe per avviare un modulo nodo in Windows. Ovviamente, è necessario installare prima npm, insieme al modulo nodo di cui ho bisogno, e quindi posso chiamare il modulo con args in C#. Il problema era che il cmd.exe non si spegneva, dovevo usare Task Mgr (proprio come questa domanda!).

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

L'argomento /c è stato fondamentale per la chiusura di cmd.exe. Quando ho iniziato, ho inserito l'argomento /K, che mantiene in esecuzione la cosa dannata. Risolto. Spero che questo ti aiuti.(Questo è come antico, ma lo dimentichiamo sempre)

+0

(Mi rendo conto che la domanda originale aveva l'argomento/c, ma ho pensato che sarebbe stato bello offrirlo comunque (/ K vs/c). –

Problemi correlati