Πράγματι, μπορείς να πάρεις notification μέσω του WMI. Υπάρχει μάλιστα ένα ωραίο εργαλείο, το Scriptomatic το οποίο σου δημιουργεί έτοιμα scripts για να κάνεις διάφορα queries με WMI.
Φοβάμαι ότι μια λύση client/server θα είναι αργή για αυτή τη δουλειά. Ίσως θα ήταν καλύτερα να κατεβάζεις τη λίστα σε κάθε μηχάνημα περιοδικά σε ένα αρχείο και να κάνεις τοπικά τον έλεγχο.
Όπως και να έχει, θα πρέπει να λάβεις υπόψη η εφαρμογή θα πρέπει να έχει τα απαραίτητα permissions για να τερματίσει άλλες εφαρμογές.
Παρόμοια δουλειά μπορείς να κάνεις μέσω του Group Policy, με τα settings, "Don't Run specified Windows Applications", "Run only allowed Windows Applications" και "List of allowed applications". Αυτά όμως δουλεύουν μόνο όταν πας να ξεκινήσεις ένα process από τον Explorer.
Σε VBScript η δουλειά γίνεται με το παρακάτω script:
| | Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Set MySink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_") objWMIservice.ExecNotificationQueryAsync MySink, "SELECT * FROM __InstanceCreationEvent" & _ " WITHIN 10 WHERE TargetInstance ISA 'Win32_Process'" WScript.Echo "Waiting for events..." Sub SINK_OnObjectReady(objObject, objAsyncContext) WScript.Echo (objObject.TargetInstance.Name) End Sub |
Η ίδια δουλειά γίνεται στο .NET χρησιμοποιώντας το System.Management namespace και την κλάση ManagementEventWatcher:
| |
using System.Management;
...
public class Form1 : System.Windows.Forms.Form {
... private ManagementEventWatcher _watcher; public Form1() { ... _watcher =new ManagementEventWatcher(@"\\.\root\cimv2", "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"); _watcher.EventArrived+=new EventArrivedEventHandler(_watcher_EventArrived); _watcher.Start(); } ... protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } _watcher.Stop(); _watcher.Dispose(); } base.Dispose( disposing ); } ... private void _watcher_EventArrived(object sender, EventArrivedEventArgs e)
{ ManagementBaseObject eventArg = (ManagementBaseObject)(e.NewEvent["TargetInstance"]); Console.WriteLine(String.Format("Process Started = {0}",eventArg["NAME"])); } |
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos