javascript - Node 智能卡在扫描卡时抛出 SCardConnect 错误,断开连接后抛出 SCardListReaders 错误

标签 javascript angularjs node.js electron smartcard

我也在使用 angular 和 electron,但之前一切正常。这是错误:

Error: SCardConnect error: 
SCardConnect error: The smart card cannot be accessed because of other connections outstanding.
(0x8010000b)

第一次扫描卡片后,它不再抛出错误并且可以正常读取卡片,直到重新启动。以下是我的一些与智能卡相关的代码片段:

const smartcard = require('smartcard');
const Devices = smartcard.Devices;
const devices = new Devices();
let currentDevices = [];

//something else

app.run(function($rootScope) {
let registerDevices = function (event) {
    currentDevices = event.devices;
    currentDevices.forEach(function (device) {
        device.on('card-inserted', event => {
            let card = event.card;
            console.log(`Card '${card.getAtr()}' inserted into '${card.device}'`);
            $rootScope.$broadcast('card-attach',card.getAtr());
        });
        device.on('card-removed', event => {
        });
        device.on('error', event => {
            console.error("Card Reader Error: " + event);
        });
    });
};

devices.on('device-activated', event => {
    console.log("Reader added :" + event.device);
    registerDevices(event);
});

devices.on('device-deactivated', event => {
    console.log("Reader removed :" + event.device);
    registerDevices(event);
});
});

此外,当我断开扫描仪时,它说

events.js:160 Uncaught Error: SCardListReaders error: The Smart Card Resource Manager is not running.
(0x8010001d)

events.js:163 Uncaught Error: Uncaught, unspecified "error" event. ([object Object])

并且扫描仪在重新连接后不工作。

最佳答案

这个错误代码是E_SHARING_VIOLATION -- 某些进程已经以独占模式连接到卡(使用 SCARD_SHARE_EXCLUSIVE 代替 SCardConnect)。


[假设您在 Windows 下]:

有一个Plug&Play Windows 中的机制默认情况下在插入后立即自动访问每张卡并尝试为其确定正确的驱动程序 - 这会在访问卡时创建一个短时间窗口(恕我直言,这是最可能的原因)。

你有两个选择:

  1. 处理它 -- 在一段时间(几十毫秒,YMMV)后针对这个特定的错误代码重试卡连接尝试(可能可以在循环中完成一些最大重试次数) ).

  2. 禁用此行为 - 有两种方法(我从未使用过组策略,但它应该有效):

    a/使用本地组策略设置(禁用计算机配置 -> 管理模板 -> Windows 组件 -> 智能卡 -> 打开智能卡即插即用服务)(参见例如 here)

    b/通过将 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\ScPnP 下的注册表项 EnableScPnP 设置为 dword:0x00000000(对于64 位系统也将其设置在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Policies\Microsoft\Windows\ScPnP 下)——参见例如here .请务必重新启动系统以使更改生效


关于您使用 0x8010001D ( E_NO_SERVICE) 错误代码进行的编辑以及重新连接阅读器——我不知道。

祝你好运!

关于javascript - Node 智能卡在扫描卡时抛出 SCardConnect 错误,断开连接后抛出 SCardListReaders 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40697650/

相关文章:

javascript - 使用 gulp-useref 如何添加额外文件?

node.js - Sequelize [object SequelizeModel] 保存不是函数

javascript - 没有过载匹配此调用。类型 'string' 不可分配给类型 'Signals'

javascript - 在 JavaScript 中创建数组集合?

javascript - Firebase 部署函数发送推送通知时出错

javascript - HTML DOM 元素是否通过引用存储在 Javascript 数组中?

javascript - HTML 表单操作是前置值而不是附加值

php - TreeStore 传递参数 - EXTJS 4

html - Angular Slider - html 我需要添加左右边距

node.js - Node JS - 加载和修改 SVG 文件