Работает ли событие WMI Win32_VolumeChangeEvent в Windows XP - PullRequest
0 голосов
/ 19 мая 2009

Я пытаюсь использовать следующий код c # для обнаружения присоединенного / удаленного события запоминающие устройства USB. Я использую Win32_VolumeChangeEvent.

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

Проблема в том, что это нормально работает в Vista, но совсем не работает в XP (события не получены). Документация Microsoft говорит, что это должно работать (http://msdn.microsoft.com/en-us/library/aa394516(VS.85).aspx). Я гуглил это довольно давно и нашел другие, которые тоже имеют эту проблему. Но я также нашел пару статей, в которых утверждается, что этот вид запроса (в основном в vbscript) ) работает с XP. Но я не могу найти какую-либо официальную информацию от Microsoft для этой проблемы, и я не могу поверить, что Microsoft пропустила эту проблему для трех пакетов обновлений.

Так что мой вопрос: кто-нибудь с успехом использовал Win32_VolumeChangeEvent на XP или может предоставить ссылку / объяснение, почему он не должен работать на XP?

Ответы [ 2 ]

1 голос
/ 21 сентября 2015

Как вы можете прочитать по собственной ссылке , минимальной поддерживаемой версией клиента для Win32_VolumeChangeEvent является Windows Vista. В любом случае, как указано здесь , вы можете выполнить запрос в пределах интервала в области действия root\\CIMV2. Вот пример из моего кода:

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 голосов
/ 19 мая 2009

«Win32_VolumeChangeEvent .. найден только в Windows Server 2003» - source

...