71859


現在、.Net Core 3.1 をターゲットとしたコンソールアプリケーションを作成しています。  
そのなかで、USBの挿入/取り外しを検出する為、以下のようにしています。

[code]

    public void BeginMonitor()
    {
        ManagementEventWatcher watcher = new ManagementEventWatcher(); 
        WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2 or EventType = 3");
        watcher.EventArrived += Watcher_EventArrived;
        watcher.Query = query;
        watcher.Start();
    
        while(true)
        {
            AuthenticationMock();
            watcher.WaitForNextEvent();
            Thread.Sleep(100);
        }
    }
    
    private void Watcher_EventArrived(object sender, EventArrivedEventArgs e)
    {
        string driveName = e.NewEvent.Properties["DriveName"].Value.ToString();
        EventType eventType = (EventType)Convert.ToInt16(e.NewEvent.Properties["EventType"].Value);
        string eventName = Enum.GetName(typeof(EventType), eventType);
    
        Console.WriteLine($"{DateTime.Now}: {driveName} {eventName}");
    }
    
[/code]

しかし、ManagementEventWatcherを使用するにはSystem.Managementを参照する必要があります。  
これはMicrosoftの推奨しないシナリオと考えています。  
[(MSDNより)](https://docs.microsoft.com/en-us/windows/win32/wmisdk/using-wmi)  
代替として、Microsoftが推奨しているMicrosoft.Management.Infrastructureを使用するべきと思っていますが、その場合ManagementEventWatcherの様な動作を実現する方法が分かりません。ポーリングして監視する方法ではなく、イベントフックで処理を行うようにしたいと考えています。

CimSessionを使用してOSやBIOS情報の取得等は出来たのですが、イベントについてはあまり記述が見当たらず、行き詰っております。参考となるドキュメントなどありましたら、ご教示お願いします。


CC BY-SA 4.0
2020-11-11T04:53:52.580
71858
2020-11-11T05:32:20.193
2020-11-11T05:12:44.717
38100
38100
question
c# .net
.NetCore 3.1 ManagementEventWatcherに代わる方法


[`CimSession.SubscribeAsync`](https://docs.microsoft.com/en-us/previous-
versions/windows/desktop/wmi_v2/mi-managed-
api/hh832612\(v=vs.85\))を用いれば実現できると思います:

[code]

    var session = CimSession.Create(null);
    
    session.SubscribeAsync(
        "ROOT\\CIMV2", "WQL", "SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2 or EventType = 3"
    ).Subscribe(e =>
    {
        string driveName = e.Instance.CimInstanceProperties["DriveName"].Value as string;
        // do something
    });
    
[/code]

`Win32_VolumeChangeEvent`自体については詳しくないので、処理の中身については未回答です。


CC BY-SA 4.0
2020-11-11T05:21:16.597
71859
2020-11-11T05:32:20.193
2020-11-11T05:32:20.193
71858
answer