2009-12-04 2 views
4

내 응용 프로그램에서 시작한 프로세스가 차례로 추가 프로세스를 생성했는지 감지하는 방법을 찾고 있습니다. 희망은 시작 및 응용 프로그램을 종료하고 종료 될 때까지 감시하고 그 응용 프로그램이 종료 될 때 다른 동작을 트리거하는 스레드를 가질 수 있다는 것입니다. 문제는 모니터하고 싶은 일부 응용 프로그램에서 추가 프로세스를 시작한 다음 종료하는 것입니다. 그래서 응용 프로그램이 종료되기 전에 트리거가 시작됩니다.프로세스가 C# .Net 2.0에서 다른 프로세스를 시작하는지 여부를 감지하는 방법이 있습니까?

예를 들어 프로세스에서 프로그램을 시작합니다. 실행 파일은 일부 파일 패치를 수행 한 다음 주 프로그램 (별도의 exe)을 시작한 다음 종료합니다. 이로 인해 Process.HasExited가 true를 반환하게되어 트리거를 너무 일찍 시작합니다. 내가 정말로 신경 쓰는 부분은 주 프로그램이 종료 될 때입니다.이 경우에는 초기 프로세스가 시작된 프로그램이지만이 작업을 프로그램 방식으로 수행 할 수는 없습니다.

+0

, 프로세스 목록의 각 과정을 보면 어떻게 든 특정 프로세스 ID에서 (직접 또는 간접적으로) 유래되었는지 확인하는 방법은 무엇입니까? –

답변

5

괜찮 았어. .NET 2.0의 Process 클래스를 사용하여 상위 프로세스 정보에 직접 액세스 할 수는 없지만 System.Diagnostics.PerformanceCounter 클래스를 사용하면 "프로세스 Id 생성"카운터 이름에서 상위 프로세스 ID에 액세스 할 수 있습니다.

... 
/// check to see if the monitored application (started in myProcess) is still running 
public bool isRunning() 
{ 
    bool running = !this.myProcess.HasExited; 
    if(!running){ 
     foreach (Process p in Process.GetProcesses()) 
     { 
      PerformanceCounter pc = new PerformanceCounter("Process", "Creating Process Id", p.ProcessName); 
      if (this.myProcess.Id == (int)pc.RawValue) 
      { 
       running = true; 
      } 
     } 
    } 
    return running; 
} 
... 
내가이 예에서 오류 처리를 떠났고, 더 진보 된 솔루션으로, 모든 지점의 목록을 유지하여 양산 프로세스 트리를 추적 할 수

: 내 문제를 해결하기 위해 내가 비슷한 않았다 이 예제는 하나의 직접적인 하위 프로세스 만 감시합니다.

1

다른 프로세스가 독점권을 갖지 않거나 제어 할 수없는 경우 새 프로세스를 생성했는지 확인하는 방법을 실제로 볼 수 없으며 생성 된 프로세스가 손자 프로세스를 생성하는지 확인하려는 경우 ... (너 내가 어디로 가는지 알지).

어쨌든 그것이 내 생각입니다. 할 수 있을지 모르지만, .NET/C#만으로는 달성 할 수 없다고 생각합니다.

다른 누군가가 진정한 해결책을 제공 할 수 있기를 바랍니다.

+0

일반적인 방법으로 어떻게 수행되는지 모르겠습니다. 프로세스 산란의 몇 가지 방법에 대한 그것은 가능하지만, 산란 과정이 당신의 통제하에 있지 않다면 ... – mfeingold

+0

당신은 아마도 .Net/C#를 사용하여 달성 할 수없는 것을 언급합니다. –

0

저는 생각 하기엔 정말 간단하지는 않지만 할 수 있습니다.

이 경우 대신 WMI를 사용합니다. 먼저 기존 프로세스 [ether way, WMI 또는 Net Process]를 나열하는 을 시작하고 이들을 기억하면 보게됩니다. 그런 다음 두 개의 WMI 이벤트 쿼리를 시작합니다. 하나는 Win32_ProcessStartTrace 이고 다른 하나는 입니다. Win32_ProcessStopTrace [WMI SDK 참조]. 둘 다 Win32_Process의 인스턴스를 반환하며 항상 "ParentProcessID"가 입니다. 이 중 하나 인 경우 이전에 저장했습니다. 생성 프로세스가 있습니다. "Win32_Process"에는 "Kill"메서드 이 포함되어 있습니다. 단서 없음, 마지막으로 수행 할 내용 ;-)

희망이 있습니다. 더 자세한 정보를 요구하는 것을 망설이지 말라.

BR - mabra 대안으로

관련 문제