列出系统上所有的智能卡读卡器(Alcor Micro读卡器问题)

5
我已经将这个软件在生产环境中运行多年,之前从未见过这个问题。我刚收到一台新笔记本电脑(HP EliteBook 8470p),它带有内置的Alcor Micro USB智能卡读取器。
以下代码将列出系统上的所有读卡器,并且似乎工作正常。我们的一些系统将有3或4个读卡器插入单个计算机。它已经通过了十几个型号的测试,没有任何问题。
奇怪的是,只有在插入智能卡时,Alcor读卡器才会被列出。如果我在设备管理器中查看它,在“智能卡读卡器”下不会显示它,除非插入卡片(除非我进入“查看”>“显示隐藏的设备”)。
有人知道为什么会这样,或者是否有办法确保它在我的软件中被列出?
谢谢。
代码:
[DllImport("WINSCARD.DLL", EntryPoint = "SCardEstablishContext", CharSet = CharSet.Unicode, SetLastError = true)]
static internal extern uint EstablishContext(ScopeOption scope, IntPtr reserved1,
    IntPtr reserved2, ref SmartcardContextSafeHandle context);

[DllImport("WINSCARD.DLL", EntryPoint = "SCardListReaders", CharSet = CharSet.Unicode, SetLastError = true)]
static internal extern uint ListReaders(SmartcardContextSafeHandle context, string groups,
    string readers, ref int size);

private bool EstablishContext()
{
    if ((this.HasContext))
    {
        return true;
    }
    this._lastErrorCode =
        (SmartcardErrorCode)UnsafeNativeMethods.EstablishContext(ScopeOption.System,
        IntPtr.Zero, IntPtr.Zero, ref this._context);
    return (this._lastErrorCode == SmartcardErrorCode.None);
}

public ArrayList ListReaders()
{
    ArrayList result = new ArrayList();

    //Make sure a context has been established before 
    //retrieving the list of smartcard readers.
    if (this.EstablishContext())
    {
        //Ask for the size of the buffer first.
        int size = this.GetReaderListBufferSize();
        //Allocate a string of the proper size in which 
        //to store the list of smartcard readers.
        string readerList = new string('\0', size);
        //Retrieve the list of smartcard readers.
        this._lastErrorCode =
            (SmartcardErrorCode)UnsafeNativeMethods.ListReaders(this._context,
            null, readerList, ref size);

        if ((this._lastErrorCode == SmartcardErrorCode.None))
        {
            //Extract each reader from the returned list.
            //The readerList string will contain a multi-string of 
            //the reader names, i.e. they are seperated by 0x00 
            //characters.
            string readerName = string.Empty;
            for (int i = 0; i <= readerList.Length - 1; i++)
            {
                if ((readerList[i] == '\0'))
                {
                    if ((readerName.Length > 0))
                    {
                        //We have a smartcard reader's name.
                        result.Add(readerName);
                        readerName = string.Empty;
                    }
                }
                else
                {
                    //Append the found character.
                    readerName += new string(readerList[i], 1);
                }
            }
        }
    }
    return result;
}

顺便说一下,这段代码是由其他人编写的,我猜测(通过过多的注释)他在网上找到了它。我对它有一定的了解,但从未深入研究过。我尝试进行了几次调整,但无法使其列出Alcor读卡器。

谢谢!


在这里从未观察到读卡器出现这种情况。对于非接触式读卡器来说,这将是特别严重的。我建议向Alcor或HP投诉以获取驱动程序更新,因为唯一的替代方案是从winscard.dll(即资源管理器)级别降至USB设备枚举。 - guidot
@guidot 感谢您的回复。是的,我已经使用读卡器工作了好几年,也从未见过这种行为。正如我所说,在Windows设备管理器中,它会显示为非活动状态,直到插入卡片,因此它肯定似乎是驱动程序/硬件级别的问题,而不是我的代码...我想我会采纳您的建议并发送电子邮件给Alcor。 - Adam Plocher
检查智能卡服务是否正在运行。 - Jitendra
它正在运行。我插了几个外部USB读卡器(一个通过打印机,一个独立的)。这两个显示出来了,但是我的笔记本电脑上的内置读卡器在我插入智能卡之前不会显示,就像USB被拔掉了一样(尽管它是我笔记本电脑中的内置USB读卡器)。我认为这与制造商/型号有关。我几天前给他们发了一封电子邮件,但还没有收到回复... - Adam Plocher
这种行为真是太恶劣了。我肯定会投诉的。听起来驱动程序开发人员选择了一条捷径。 - Maarten Bodewes
我大约一个月前尝试联系他们,但仍未收到回复。我将在此问题上开启悬赏,看看是否有人有相关经验。谢谢。 - Adam Plocher
1个回答

4

好的,我感到非常愚蠢,在开启悬赏后立即找到了答案。我花了一段时间从软件角度来看待这个问题,并放弃了一段时间 - 当我回来重新审视这个问题时,我决定它可能适合作为一个悬赏。

我决定更仔细地查看我的BIOS选项,猜猜看?那里有一个选项说“智能卡阅读器上电:a)当插入卡时,b)始终”。我将其改为“始终”并且它就可以工作了。啊!

由于现在已经有悬赏了,所以它不让我删除我的问题,但基本上这就是我的答案。谢谢大家的评论和建议。


非常感谢您发布这篇文章。您节省了我数小时的时间,让我不再疑惑为什么它会这样做,以及为什么我的代码现在无法正常工作。 - darbid
此外,还请参见 MSDN 上的 如何枚举智能卡上的证书 和相关讨论的 [长期存在的] 微软错误。 - jww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接