2009-02-04 7 views
9

Wir versuchen, eine kleine Anwendung zu entwickeln, die die Programme/Prozesse überwachen kann, die in einer Windows-Maschine ausgeführt werden.Wie überwacht man die Prozess-/Programmausführung in Windows?

Wenn das Programm/der Prozess nicht ausgeführt werden soll, sollte er blockiert werden. Es funktioniert ähnlich wie ein Antivirenprogramm.

Dies ist die Grundidee.

Ich möchte die Möglichkeiten kennen, in das Betriebssystem einzubinden, um über jedes einzelne Programm/jeden Prozess benachrichtigt zu werden, der versucht, in der Maschine zu laufen.

Antwort

9

Der einfachste Weg, WMI zu verwenden ist. Überwachen Sie speziell das Win32_ProcessStartTrace. Dies ist besser als Win32_Process, da es eingerichtet ist, Ereignisse zu verwenden, während Win32_Process Abfragen erfordert, die CPU-intensiver sind. Unten ist, wie man es in C# macht. Stellen Sie zunächst sicher, dass System.Management als Referenz für Ihr Projekt eingerichtet ist.

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

Der Code generiert jedes Mal eine Meldung, wenn Sie einen neuen Prozess starten. Von dort aus können Sie eine Whitelist/Blacklist prüfen und entsprechend handeln.

+1

Leider scheint WMI Benachrichtigungen bis zu 5 Sekunden später zu liefern, als der Prozess erstellt wurde. Nicht nützlich für Benachrichtigungen in Echtzeit oder für kurzlebige Aufgaben. –

+1

Ich fand ein Beispiel auf der Microsoft-Website für die gleiche Aufgabe [hier] (http://msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.waitfornextevent.aspx?cs-save-lang=1&cs- lang = csharp # code-snippet-1), aber es hat das gleiche Problem. –

+0

Gah ... die Verwendung von WMI ist CPU-intensiver als das manuelle Abfragen der Prozessliste (es passiert nur im WMI-Service-Prozess statt in Ihrem Prozess). Wenn Ihre Anwendung abstürzt, wird das Abonnement weiterhin im WMI-Dienst ausgeführt. –

0

Ich habe nicht versucht, Echtzeit-Benachrichtigung zu geben. Wie auch immer, hier ist, wie in C# laufenden Prozesse erhalten

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

Sie können auch folgende Requisiten eines Prozesses verwenden

  • Starttime - Zeigt die Zeit der Prozess
  • TotalProcessorTime gestartet - die Shows Menge der CPU-Zeit hat der Prozess
  • Themen genommen - ermöglicht den Zugriff auf die Sammlung von Threads im Prozess
0

Ich würde die Win32-api SetWindowsHookEx mit der Konstante WH_GETMESSAGE überprüfen, um einen Rückruf zu Ihrem Programm hinzuzufügen, wenn ein neues Fenster erstellt wird.

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

Google, dass API und WH_GETMESSAGE um mehr zu erfahren.

auch folgende Artikel/code librarys check out: 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