2011-01-28 3 views
7

ASP.Net 웹 응용 프로그램의 명령 프롬프트를 통해 명령을 실행하려고합니다. 웹 서버의 작업 관리자에서 프로세스 시작을 볼 수 있지만 프로세스가 그냥 앉아서 끝나지 않고 지정한 명령을 실행하지도 않습니다.Process.Start()를 통해 호출 할 때 "cmd.exe/C 명령"이 종료되지 않는 이유는 무엇입니까?

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

표준 출력을 읽었을 때와 읽지 않은 경우 모두 시도했습니다.

작업 관리자를 통해 프로세스가 종료 될 때까지 응용 프로그램이 process.WaitForExit();에 멈춰 있습니다.

+2

표준 출력을 읽으려고한다면 표준 출력이 무엇인지 살펴 보았는가? 표준 오류도 읽으십시오. 어떤 종류의 오류 메시지가 표시 될 수 있습니다. 아마도 "계속하려면 아무 키나 누르십시오 ..."라고하는 메시지 나 그 효과가있는 메시지 일 수도 있습니다. – GWLlosa

+0

@ GWLosa 표준 출력과 표준 오류는 모두 비어 있습니다. 그 "Push any key ..."에 대해 생각 했으므로 표준 입력에 문자를 쓰려고 시도했지만 여전히 아무것도 쓰지 않았습니다. –

+2

왜 cmd를 통해 실행합니까? 왜 직접 실행하지 않습니까? –

답변

2

우리가 실제로 무슨 일이 일어나고 있는지 결정하기 위해 처리하려고하는 명령을 이해 할 필요가 있다고 생각합니다. 또한 서버가 실행중인 OS를 알아야합니다.

예를 들어, "echo test> C : \ test.txt"를 시도한 사용자 의견에서 알 수있었습니다. Windows Server 2008 (및 Windows 7)에서는 파일을 만들기 위해 루트 디렉터리에 관리자 권한이 필요합니다. 이 IIS에서 실행중인 경우 내 추측은 IIS 사용자가 관리자가 아니며 보안 예외가 발생하는 것입니다.

또한 많은 명령에는 UAC로 인해 상승 된 권한이 필요할 수 있습니다. 나는 정확하게 기억하지 못한다.하지만 UAC에 의해 명령이 잡히면 UAC 확인을 기다리는 중이다. 어느 쪽이 이라고 대답하면 명령 줄을 통해 제공 할 수 없다.

작업자 프로세스 사용자 계정으로 로그인하지 않으면 시스템에 로그인하여 직접 실행하면 이러한 유형의 문제가 표시되지 않습니다.

그래서 맨 먼저해야 할 일은 실행중인 프로세스가 실행중인 사용자가 실행중인 작업을 수행 할 수 있는지 여부를 파악하고 실행하는 것입니다. 보안 기능이있어 사용자를 보호 할 수 있으므로 사용자에게 추가 권한을 부여 할 때는주의해야합니다.

한 컴퓨터에서 다른 컴퓨터에서 다시 작동하는 이유는 해당 컴퓨터가 실행중인 OS와 명령이 실행중인 사용자의 구성에 따라 다릅니다.

이것이 정말로 보안상의 문제인 경우 의심되는 경우 serverfault.com에 질문을 게시하여 작업자 프로세스 사용자 아래에서 다양한 명령을 실행하는 데 필요한 권한 집합을 확인해야합니다.

기계 이벤트 로그에서 명령에 대한 경고 또는 오류가 있는지 확인할 수 있습니다. 때로는 이런 일이 일어나서 일어난 일에 대해 좀 더 많은 정보를 얻을 수 있습니다.

+0

와우. 나는이 질문이 얼마나 오래된지를 보았다. – NotMe

+0

입력 해 주셔서 감사합니다. 실제로 그것에 대해 잊어 버렸습니다. 권한 문제였습니다. –

1

일단 CMD로 전달되면 컨트롤이 셸로 전달됩니다. 그것은 가까운 다음과 같이 추가하는 것이 좋습니다 :

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

그 일을하기 전에 무엇이든하기 전에 프로세스가 종료 될 수 있습니다. – andynormancx

+0

사실, 파일을 만들거나 .NET 부분에 완료되었다고 알려주고 무언가를 업데이트해야합니다. – jschorr

0

Windows에서 노드 모듈을 시작하려면 cmd.exe를 호출합니다. npm은 분명히 내가 필요로하는 노드 모듈과 함께 먼저 설치되어야하며, C#에서 args를 가진 모듈을 호출 할 수있다. 문제는 cmd.exe가 종료되지 않았기 때문에이 질문과 마찬가지로 Task Mgr을 사용해야한다는 것입니다.

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

/c 인수는 cmd.exe를을 폐쇄 핵심이었다. 처음 시작했을 때 나는 /K이라는 인자를 넣었습니다. 해결 됐어. 희망이 도움이됩니다.(이것은 고대와 마찬가지지만 우리는 항상 잊는다)

+0

(원래 질문에/c 인수가 있다는 것을 알았지 만 어쨌든 이것을 제공하는 것이 좋을 것이라고 생각했습니다 (/ K vs/c). –

관련 문제