如何通过 WMI 获取系统上的所有智能卡读卡器

本文关键字:智能卡 读卡器 何通过 WMI 获取 系统 | 更新日期: 2023-09-27 18:35:55

我想使用 WMI 获取系统上所有 PCSC 智能卡读卡器的设备 ID 和服务。它们都通过 USB 连接,因此我在 WMI 注册表中查询所有Win32_PnPEntity。但我不知道如何确定哪些设备是"读卡器"。这是我已经拥有的:

ManagementObjectSearcher mos =
new ManagementObjectSearcher(@"'root'cimv2", @"Select * From Win32_PnPEntity");
ManagementObjectCollection mob = mos.Get();
foreach (ManagementObject mo in mob)
{
    Console.WriteLine("DeviceID: " + mo["DeviceID"].ToString());
    Console.WriteLine("Service: " + mo["Service"].ToString());
}

我不能只过滤设备名称,有不同的品牌/型号的读者,也没有共同点。在设备管理器中,它们都归入"智能卡读卡器",因此必须有(其他)方式。

如何通过 WMI 获取系统上的所有智能卡读卡器

我在MSDN上找到了设备类GUID:{50dd5230-ba8a-11d1-bf5d-0000f805f530}

Smart Card Readers
Class = SmartCardReader
ClassGuid = {50dd5230-ba8a-11d1-bf5d-0000f805f530}
This class includes smart card readers.

所以最后我想出了这个:

ManagementObjectSearcher mos = new ManagementObjectSearcher(@"'root'cimv2",
@"SELECT * FROM Win32_PnPEntity WHERE ClassGuid = '{50DD5230-BA8A-11D1-BF5D-0000F805F530}'");

这似乎给了我想要的:)

我这里没有任何智能卡读卡器,所以这是理论上的:

  • 返回的实例的实际类型(__CLASS属性)是什么。如果是子类型,也许寻找该类型的更多实例会有所帮助)。

  • 智能卡设备存在哪些关联:

    associators of {__RELPATH}
    

    其中__RELPATH是Win32_PnPEntity实例中的相同命名属性。还包括关联者的关联者。

    请注意,大多数关联的实例将表示诸如USB主机/集线器设备之类的东西,但其他实例可以是设备的其他方面(例如HDD除了Win32_PnPEntity之外,还具有Win32_PhysicalDisk实例)。

此外,为了加快探索 WMI 类型和对象的速度,我建议使用控制台或 GUI 工具之一,这将比编写 C# 代码容易得多。例如。在PowerShell中:

gwmi -query "select * from Win32_PnpEntity" | ft -autosize __RELPATH, DeviceID

比 C# 代码更容易使用(但是它需要一个非常宽的控制台窗口:-))。