2009-05-19 4 views
0

Ich versuche den folgenden C# -Code zu verwenden, um das angehängte/entfernte Ereignis von USB-Massenspeichergeräten zu erkennen. Ich verwende Win32_VolumeChangeEvent.Funktioniert das WMI-Ereignis Win32_VolumeChangeEvent unter Windows XP?


// Initialize an event watcher and subscribe to events that match this query    
var _watcher = new ManagementEventWatcher("select * from Win32_VolumeChangeEvent"); 
_watcher.EventArrived += OnDeviceChanged; 
_watcher.Start(); 

void OnDeviceChanged(object sender, EventArrivedEventArgs args) 
{ 
    Console.WriteLine(args.NewEvent.GetText(TextFormat.Mof)); 
} 

Das Problem ist, dass dies auf Vista funktioniert gut, aber es funktioniert nicht bei allen auf XP (keine Ereignisse empfangen). Die Microsoft-Dokumentation besagt, dass dies funktionieren sollte (http://msdn.microsoft.com/en-us/library/aa394516(VS.85).aspx). Ich habe lange gegoogelt und andere gefunden, die dieses Problem haben. Aber ich fand auch ein paar Artikel, die behaupten, dass diese Art von Abfrage (meistens in VBScript) mit XP funktioniert. Aber ich kann einige offizielle Informationen von Microsoft für dieses Problem nicht finden und ich kann nicht glauben, dass Microsoft dieses Problem für drei Service Packs übersehen hat.

Also meine Frage ist: hat jemand das Win32_VolumeChangeEvent mit Erfolg auf XP verwendet oder kann einen Link/Erklärung, warum es nicht auf XP arbeiten sollte?

Antwort

0

Wie Sie in Ihrem eigenen link, die Mindest Unterstützte Client-Version für Win32_VolumeChangeEvent ist Windows Vista lesen kann. Wie auch immer, wie vorgeschlagen here, können Sie eine Abfrage innerhalb des Intervalls im Bereich root\\CIMV2 ausführen. Hier ein Beispiel aus einem Code von mir:

WqlEventQuery query; 
ManagementScope scope; 
ManagementEventWatcher watcher; 
public void DoWork() 
{ 
    // Check if OS Version is earlier than Windows Vista 
    if (USBHandlerWorker.OSVersion() <= 6) 
    { 
     scope = new ManagementScope("root\\CIMV2"); 
     scope.Options.EnablePrivileges = true; 

     query = new WqlEventQuery(); 
     query.EventClassName = "__InstanceCreationEvent"; 
     query.WithinInterval = new TimeSpan(0, 0, 1); 
     query.Condition = @"TargetInstance ISA 'Win32_USBControllerdevice'"; 

     watcher = new ManagementEventWatcher(scope, query); 
     watcher.EventArrived += watcher_EventArrived; 
     watcher.Start(); 
    } 
    else 
    { 
     watcher = new ManagementEventWatcher(); 
     // The event types 2 and 3 are for plug and unplug events 
     query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent " + 
      "WHERE EventType = 2 OR EventType = 3"); 
     watcher.EventArrived += watcher_EventArrived; 
     watcher.Query = query; 
     watcher.Start(); 
    } 
} 
+0

Als ich diese Frage gestellt vor sechs Jahren war es in der Dokumentation nicht geschrieben, aber jetzt ist es. Jedenfalls hoffe ich, dass sich noch niemand für Windows XP entwickelt ;-) –

0

"Win32_VolumeChangeEvent .. wird nur unter Windows Server 2003 gefunden" - source