建立资源管理器上下文以使用智能卡读卡器

Posted

技术标签:

【中文标题】建立资源管理器上下文以使用智能卡读卡器【英文标题】:Establish resource manager context to use smart card reader 【发布时间】:2019-05-31 15:33:46 【问题描述】:

我正在使用 Visual Studio 2017 开发一个c++ 应用程序。

我正在使用 Windows 库 winscard。 我从一个简单的项目开始,我调用函数SCardEstablishContext 作为读取智能卡所需的第一步。

我正在使用的代码的 sn-p 如下:

LONG resContext = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hSC);
if (resContext != SCARD_S_SUCCESS) 
    printf("Failed\n");
    printf("Error %X\n", resContext);

我所知道的是,这个函数使用称为“智能卡”的 Windows 服务来获取执行数据库操作的范围(读/写卡)。

不幸的是,这个简单的应用程序只能在 Windows 7 环境中工作(即返回 SCARD_S_SUCCESS 代码)。在我测试的所有 Windows 10 系统中,返回代码始终是 0x8010001DL,它与声明的定义 SCARD_E_NO_SERVICE 相关联:

智能卡资源管理器未运行。

在 Windows 7 系统上,该程序在没有管理员权限的情况下工作,在 Windows 10 系统上,我也尝试过使用管理员权限,但错误是一样的。

在我测试的每个 Windows 10 系统中,我在测试我的程序之前手动启动了“智能卡”服务,并在测试时检查它是否仍在运行。

在 Windows 7 和 Windows 10 系统中,我没有连接智能卡读卡器。

我使用的winscard.lib文件附带Microsoft Windows SDK版本10.0.17763.0

要让它在 Windows 10 上运行,还需要做一些额外的事情吗?

【问题讨论】:

智能卡子系统(和资源管理器)必须“开箱即用”。尝试安装一些为系统提供虚拟插槽的智能卡驱动程序。例如这个one 您是否通过 RDP 工作? @Alexander 感谢您指出这一点,我是!我已经直接在设备上尝试了我的程序,现在函数返回SCARD_S_SUCCESS,但为什么会出现这种行为?在没有连接智能卡的情况下,我仍然无法在 win10 电脑上运行。安装该智能卡驱动程序没有帮助。也许连接读取可以解决(我没有一个atm)? 我有一个可以“插入”的虚拟令牌,然后可以通过智能卡资源管理器看到。我可以和你分享,但看不到私密的交流方式。 @Alexander 谢谢你,但下周我将有一个 USB 读卡器,我会看到的。重要的部分是在平板电脑上与读者交流,我已经做到了。请添加答案,以便我分配赏金。 【参考方案1】:

智能卡子系统(和资源管理器)必须“开箱即用”。

尝试安装一些向系统提供虚拟插槽的智能卡驱动程序。 例如这个one。

您是否通过 RDP 工作?

【讨论】:

我对 RDP 问题的回答是“是”。我直接登录电脑,神奇:我看到了智能卡读卡器。我想这是一项安全功能,因此您不会与全世界分享您的智能卡。【参考方案2】:

正如documentation中所说的那样

调用应用程序必须具有适当的访问权限 任何数据库操作。

这意味着您应该以管理员权限运行程序。

【讨论】:

是的,我的问题中没有提到,但我也尝试了管理员权限,但结果是一样的。

以上是关于建立资源管理器上下文以使用智能卡读卡器的主要内容,如果未能解决你的问题,请参考以下文章

未检测到智能卡读卡器 - PCSC 错误 - 0x8010002e

黑莓智能卡读卡器示例

使用 java smartcardio 函数发送 APDU 命令以将数据写入智能卡读卡器

如何在智能卡读卡器中实现被动认证?

如何访问 Omnikey 3121 智能卡读卡器

使用 ACR38 读卡器从 SLE 4442 智能卡读取数据