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

Posted

技术标签:

【中文标题】如何通过 WMI 获取系统上的所有智能卡读卡器?【英文标题】:How do I get all the smart card readers on my system via WMI? 【发布时间】:2012-05-30 08:35:11 【问题描述】:

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

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());

我不能只根据设备名称进行过滤,阅读器的品牌/型号不同,而且没有共同点。在设备管理器中,它们都归类在“智能卡读卡器”下,因此必须有(其他)方式。

【问题讨论】:

【参考方案1】:

我在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'");

这似乎给了我想要的东西:)

【讨论】:

【参考方案2】:

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

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

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

associators of __RELPATH

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

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

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

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

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

【讨论】:

很遗憾,我找不到任何相关内容。

以上是关于如何通过 WMI 获取系统上的所有智能卡读卡器?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过读卡器使用Java激活/开启ICC卡?

在C#中如何获取系统中所安装的所有软件信息

如何检索基本的智能卡信息

如何通过 C# WMI / WMI Code Creator 检测 RealSense 摄像头

在当前阅读器上的智能卡上查找证书

如何通过 Web 使用智能卡和智能卡读卡器实现双因素身份验证