2009-02-04 3 views
9

우리는 Windows 시스템에서 실행중인 프로그램/프로세스를 모니터 할 수있는 작은 응용 프로그램을 개발하려고합니다.Windows에서 프로세스/프로그램 실행을 모니터링하는 방법은 무엇입니까?

프로그램/프로세스가 실행되지 않아야한다면 차단되어야합니다. 그것은 안티 바이러스와 유사하게 작동합니다.

이것은 기본적인 아이디어입니다.

컴퓨터에서 실행하려고하는 모든 단일 프로그램/프로세스에 대해 알리기 위해 OS에 연결하는 방법을 알고 싶습니다.

답변

9

가장 쉬운 방법은 WMI를 사용하는 것입니다. 특히 Win32_ProcessStartTrace를 모니터링하십시오. 이것은 Win32_Process가 이벤트를 사용하도록 설정 되었기 때문에 Win32_Process보다 좋지만, Win32_Process는 CPU를 많이 사용하는 폴링이 필요합니다. 아래는 C#에서 수행하는 방법입니다. 먼저 System.Management가 프로젝트의 참조로 설정되어 있는지 확인하십시오.

public System.Management.ManagementEventWatcher mgmtWtch; 

    public Form1() 
    { 
     InitializeComponent(); 
     mgmtWtch = new System.Management.ManagementEventWatcher("Select * From Win32_ProcessStartTrace"); 
     mgmtWtch.EventArrived += new System.Management.EventArrivedEventHandler(mgmtWtch_EventArrived); 
     mgmtWtch.Start(); 
    } 

    void mgmtWtch_EventArrived(object sender, System.Management.EventArrivedEventArgs e) 
    { 
     MessageBox.Show((string)e.NewEvent["ProcessName"]); 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     mgmtWtch.Stop(); 
    } 

코드는 새 프로세스를 시작할 때마다 메시지 상자를 생성합니다. 거기에서 화이트리스트/블랙리스트를 확인하고 적절하게 행동 할 수 있습니다.

+1

불행히도 WMI는 프로세스가 생성 된 후 최대 5 초 후에 알림을 배달하는 것으로 보입니다. 실시간 알림이나 수명이 짧은 작업을 수행하는 데는 유용하지 않습니다. –

+1

동일한 작업에 대한 Microsoft의 웹 사이트에서 예제를 발견했습니다. [http://msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.waitfornextevent.aspx?cs-save-lang=1&cs- lang = csharp # code-snippet-1). 그러나 동일한 문제가 있습니다. –

+0

Gah ... WMI를 사용하면 수동으로 프로세스 목록을 폴링하는 것보다 CPU를 많이 사용합니다 (프로세스가 아닌 WMI 서비스 프로세스에서만 발생). 또한 응용 프로그램이 충돌하는 경우 구독은 WMI 서비스에서 계속 실행되어 CPU를 빠져 나갑니다. –

0

실시간 알림을받지 못했습니다. 프로세스가

  • TotalProcessorTime를 시작한 시간을 보여줍니다 - -을 표시하는 방법 지금, 여기

    using System.Diagnostics; 
    
    //Somewhere in your method 
    
    Process[] runningList = Process.GetProcesses(); 
    
    foreach(Process p in runningList){ 
    Console.WriteLine("Process: {0} ID: {1}", p.ProcessName, p.Id); 
    } 
    

    또한 프로세스의 다음과 같은 소품을 사용할 수는 상영 시간이

    • 는 C#에서 실행중인 프로세스를 얻는 방법이다 프로세스가 수행 한 CPU 시간의 양
    • 스레드 - 프로세스의 스레드 컬렉션에 대한 액세스를 제공합니다.
  • 0

    Win32-api SetWindowsHookEx 상수 WH_GETMESSAGE를 사용하여 새 창을 만들 때 프로그램에 콜백을 추가합니다.

    http://pinvoke.net/default.aspx/user32.SetWindowsHookEx

    구글이 API와 WH_GETMESSAGE은 자세한 내용을 찾을 수 있습니다.

    은 또한 다음과 같은 기사/코드 librarys 체크 아웃 : http://www.vbaccelerator.com/home/Vb/Code/Libraries/Hooks/vbAccelerator_Hook_Library/article.asp

    http://www.codeproject.com/KB/DLL/hooks.aspx?fid=2061&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&select=726975