2009-02-04 8 views
9

Nous essayons de développer une petite application qui peut surveiller les programmes/processus qui s'exécutent dans une machine Windows.Comment surveiller l'exécution de processus/programme dans Windows?

Si le programme/processus n'est pas censé fonctionner, il doit être bloqué. Cela fonctionne comme un antivirus.

C'est l'idée de base.

Je veux connaître les façons de se connecter à l'OS pour être informé de chaque programme/processus essayant de fonctionner dans la machine.

Répondre

9

La façon la plus simple est d'utiliser WMI. Surveillez spécifiquement Win32_ProcessStartTrace. Cela vaut mieux que Win32_Process, car il est configuré pour utiliser les événements alors que Win32_Process requiert une interrogation plus gourmande en ressources processeur. Voici comment le faire en C#. Assurez-vous d'abord que System.Management est configuré en tant que référence pour votre projet.

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

Le code va générer un à chaque fois messagebox vous lancez une nouvelle procédure. De là, vous pouvez vérifier une liste blanche/liste noire et agir de manière appropriée.

+1

Malheureusement, WMI semble envoyer des notifications jusqu'à 5 secondes plus tard que le processus a été créé. Pas utile pour les notifications en temps réel ou faire quoi que ce soit avec des tâches de courte durée. –

+1

J'ai trouvé un exemple sur le site Web de Microsoft pour la même tâche [ici] (http://msdn.microsoft.com/fr-fr/library/system.management.managementeventwatcher.waitfornextevent.aspx?cs-save-lang=1&cs- lang = csharp # code-snippet-1), mais il a le même problème. –

+0

Gah ... l'utilisation de WMI est plus gourmande en ressources processeur que l'interrogation manuelle de la liste de processus (cela se produit simplement dans le processus de service WMI au lieu de votre processus). De plus, si votre application tombe en panne, l'abonnement continuera à fonctionner dans le service WMI, aspirant le CPU ... –

0

Je n'ai pas essayé d'obtenir une notification en temps réel. Comment jamais, Voici comment faire avancer les processus en cours d'exécution en C#

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

Vous pouvez également utiliser les accessoires suivants d'un processus

  • StartTime - Indique le moment où le processus a commencé
  • TotalProcessorTime - Affiche la quantité de temps CPU le processus a pris
  • threads - donne accès à la collection de fils dans le processus
0

Je voudrais vérifier le Win32-api SetWindowsHookEx avec la constante WH_GETMESSAGE pour ajouter un rappel à votre programme lorsqu'une nouvelle fenêtre est en cours de création.

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

Google que l'API et WH_GETMESSAGE pour en savoir plus.

Consultez également les articles/code librarys suivants: 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