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

时间:2012-05-30 08:35:11

标签: c# .net wmi smartcard pcsc

我想使用WMI在我的系统上获取所有PCSC智能卡读卡器的DeviceID和服务。它们都通过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());
}

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

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

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

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

    associators of {__RELPATH}
    

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

    请注意,大多数相关联的实例将代表USB主机/集线器设备之类的内容,但其他实例可能是设备的其他方面(例如,除了{{1}之外,HDD还将同时具有Win32_PhysicalDisk实例})。

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

Win32_PnPEntity

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