建立资源管理器上下文以使用智能卡读卡器
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