我如何获取有关最近连接的USB设备的信息

时间:2019-01-21 16:50:32

标签: c# windows wmi

当USB设备与Win32_DeviceChangeEvent连接时,我可以捕捉到

但是只允许查看3个属性

Article.objects.filter(articlestats__elapsed_time_in_seconds__lte=300)

但是我不知道如何获取有关此设备的所有信息。具体而言,其端口和集线器,VirtualHubAdress名称等。

class Win32_DeviceChangeEvent : __ExtrinsicEvent
{
  uint8  SECURITY_DESCRIPTOR[];
  uint64 TIME_CREATED;
  uint16 EventType;
};

也许我可以使用像这样的东西来做到

public enum EventType
{
    Inserted = 2,
    Removed = 3
}

public static void RegisterUsbDeviceNotification()
{
    var watcher = new ManagementEventWatcher();
    var query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
    //watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
    watcher.EventArrived += (s, e) =>
    {
        //here is im need to get info about this device

        EventType eventType = (EventType)(Convert.ToInt16(e.NewEvent.Properties["EventType"].Value));
    };

    watcher.Query = query;
    watcher.Start();
}

3 个答案:

答案 0 :(得分:0)

您可以尝试使用Win32_PnPEntity来获取详细信息。 Win32_PnPEntity class

答案 1 :(得分:0)

您可以使用ORMi创建观察者,以便获取有关任何新设备的信息:

WMIHelper helper = new WMIHelper("root\\CimV2");

WMIWatcher watcher = new WMIWatcher("root\\CimV2", "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PnPEntity'");
watcher.WMIEventArrived += Watcher_WMIEventArrived;

然后您可以观看事件:

private static void Watcher_WMIEventArrived(object sender, WMIEventArgs e)
{
    //DO YOUR WORK
}

答案 2 :(得分:0)

Win32_DeviceChangeEvent仅报告发生的事件的类型和事件的时间(uint64,代表UTC,1601年1月1日之后的100纳秒间隔)。如果您还想知道什么到达或被删除,则没什么用。

我建议改用WqlEventQuery类,将其EventClassName设置为__InstanceOperationEvent
该系统类提供 TargetInstance 属性,可以将该属性强制转换为ManagementBaseObject,这是完整的管理对象,还提供有关生成事件的设备的基本信息。
在这些信息(包括设备的友好名称)中, PNPDeviceID 可用于构建其他查询以进一步检查引用的设备。

WqlEventQuery的{​​{3}}属性可以在此处设置为 TargetInstance ISA 'Win32_DiskDrive'
可以将其设置为任何其他感兴趣的Win32_类。

设置事件监听器(本地计算机):
(事件处理程序称为 DeviceChangedEvent

WqlEventQuery query = new WqlEventQuery() {
    EventClassName = "__InstanceOperationEvent",
    WithinInterval = new TimeSpan(0, 0, 3),
    Condition = @"TargetInstance ISA 'Win32_DiskDrive'"
};

ManagementScope scope = new ManagementScope("root\\CIMV2");
using (ManagementEventWatcher MOWatcher = new ManagementEventWatcher(scope, query))
{
    MOWatcher.Options.Timeout = ManagementOptions.InfiniteTimeout;
    MOWatcher.EventArrived += new EventArrivedEventHandler(DeviceChangedEvent);
    MOWatcher.Start();
}

事件处理程序在 e.NewEvent.Properties["TargetInstance"] 中接收表示Condition类的管理对象。
有关可直接在此处使用的属性的信息,请参阅文档。

__InstanceOperationEvent 报告的 e.NewEvent.ClassPath.ClassName 派生的兴趣类别可以是:

Win32_DiskDrive:已检测到新的设备到达。
__InstanceCreationEvent:检测到设备被移除。
__InstanceDeletionEvent:现有设备已经过某种修改。

请注意,该事件是在辅助线程中引发的,我们需要 BeginInvoke UI线程以使用新信息更新UI。

请参见此处:__InstanceModificationEvent,该类提供有关设备的大多数可用信息(信息经过过滤以仅显示USB设备,但是可以删除过滤器)。

private void DeviceChangedEvent(object sender, EventArrivedEventArgs e)
{
    using (ManagementBaseObject MOBbase = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)
    {
        string oInterfaceType = MOBbase?.Properties["InterfaceType"]?.Value.ToString();
        string devicePNPId = MOBbase?.Properties["PNPDeviceID"]?.Value.ToString();
        string deviceDescription = MOBbase?.Properties["Caption"]?.Value.ToString();
        string EventMessage = $"{oInterfaceType}: {deviceDescription} ";

        switch (e.NewEvent.ClassPath.ClassName)
        {
            case "__InstanceDeletionEvent":
                EventMessage += " removed";
                this.BeginInvoke(new MethodInvoker(() => { this.UpdateUI(EventMessage); }));
                break;
            case "__InstanceCreationEvent":
                EventMessage += "inserted";
                this.BeginInvoke(new MethodInvoker(() => { this.UpdateUI(EventMessage); }));
                break;
            case "__InstanceModificationEvent":
            default:
                Console.WriteLine(e.NewEvent.ClassPath.ClassName);
                break;
        }
    }
}


private void UpdateUI(string message)
{
   //Update the UI controls with the updated informations
}