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

C# 列出系统上的所有智能卡读卡器(Alcor Micro reader问题),c#,hardware,smartcard,smartcard-reader,C#,Hardware,Smartcard,Smartcard Reader,我已经让这个软件在生产中运行多年了,以前从未见过这个问题。我刚收到一台新的笔记本电脑(HP EliteBook 8470p),它内置了一个Alcor Micro USB智能卡读卡器 下面的代码将列出一个系统上的所有读卡器,似乎工作正常。我们的一些系统将在一台计算机上插入3或4个读卡器。它已经用十几种型号进行了测试,没有任何问题 奇怪的是,Alcor阅读器只有在插入智能卡时才会被列出。如果我在设备管理器中查看它,它也不会显示在“智能卡读卡器”下,直到插入一张卡(除非我进入查看>显示隐藏设备) 有人

我已经让这个软件在生产中运行多年了,以前从未见过这个问题。我刚收到一台新的笔记本电脑(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;
}
[DllImport(“WINSCARD.DLL”,EntryPoint=“scardesttablishcontext”,CharSet=CharSet.Unicode,SetLastError=true)]
静态内部外部uint建立上下文(范围选项范围,IntPtr保留1,
IntPtr reserved2,参考SmartcardContextSafeHandle上下文);
[DllImport(“WINSCARD.DLL”,EntryPoint=“SCardListReaders”,CharSet=CharSet.Unicode,SetLastError=true)]
静态内部外部uint ListReaders(SmartcardContextSafeHandle上下文、字符串组、,
字符串读取器,ref int size);
私有布尔上下文()
{
if((this.HasContext))
{
返回true;
}
这是最新的错误代码=
(SmartcardErrorCode)非安全方法。建立上下文(ScopeOption.System,
IntPtr.Zero,IntPtr.Zero,请参考此;
返回(this.\u lastErrorCode==SmartcardErrorCode.None);
}
公共ArrayList ListReaders()
{
ArrayList结果=新建ArrayList();
//确保之前已建立上下文
//正在检索智能卡读卡器列表。
if(this.buildContext())
{
//首先询问缓冲区的大小。
int size=this.GetReaderListBufferSize();
//分配一个大小合适的字符串,其中
//存储智能卡读卡器列表。
字符串读取器列表=新字符串('\0',大小);
//检索智能卡读卡器列表。
这是最新的错误代码=
(SmartcardErrorCode)unsafentiveMethods.ListReaders(此.\u上下文,
null、readerList、ref大小);
if((this.\u lastErrorCode==SmartcardErrorCode.None))
{
//从返回的列表中提取每个读取器。
//readerList字符串将包含多个
//读卡器名称,即它们由0x00分隔
//人物。
string readerName=string.Empty;
对于(int i=0;i 0))
{
//我们有一个智能卡阅读器的名字。
结果.添加(readerName);
readerName=string.Empty;
}
}
其他的
{
//追加找到的字符。
readerName+=新字符串(readerList[i],1);
}
}
}
}
返回结果;
}
顺便说一句,这段代码是由其他人写的,我猜他(通过过多的评论)在网上的其他地方找到了它。我对它有点熟悉,但从未深入研究过。我试着对它做了一些调整,但根本无法让它列出Alcor阅读器


谢谢

好吧,在打开悬赏后立即找到答案,我觉得很愚蠢。我花了一段时间从软件的角度来看这个问题,并放弃了一段时间——当我回来重新审视这个问题时,我认为它可能适合赏金

我决定仔细看看我的BIOS选项,你猜怎么着?里面有一个选项,上面写着“打开智能卡读卡器:a)插入卡时,b)始终”。我把它改成了“永远”,它就行了。啊


它不会让我删除我的问题,因为它现在有悬赏,但这基本上是我的答案。感谢您的评论/建议。

这里的读者从未注意到这种效果。对于非接触式阅读器来说,这尤其令人讨厌。我会向Alcor或HP投诉,要求更新驱动程序,因为唯一的选择是从winscard.dll(即资源管理器)级别下降到USB设备枚举级别。@guidot感谢您的回复。是的,我和读者合作多年,也从未见过这种行为。正如我所说,它在Windows的设备管理器中也做了同样的事情-它在插入卡之前显示为非活动状态,因此它显然是驱动程序/硬件级别的东西,而不是我的代码。。。我想我会采纳你的建议,给Alcor发送一封电子邮件。检查智能卡服务是否正在运行……它正在运行。我有两个插入的外部USB读卡器(一个通过打印机,一个独立)。这两张卡都会出现,但我笔记本电脑的内置卡在我插入智能卡之前不会出现。它在设备管理器中也是这样运行的——在我插入一张卡之前,它显示为一个不活动的读卡器——就像USB被拔下一样(尽管它是我笔记本电脑中的一个内部USB读卡器)。我想这与这个制造商/型号有关。我几天前给他们发了一封电子邮件,但没有回音……这是非常恶劣的行为。我当然会抱怨。听起来驱动程序开发者选择了一条捷径。非常感谢您发布此消息。您为我节省了几个小时,让我纳闷为什么它会这样做,为什么我现在正在工作的代码不会这样做。另请参阅MSDN上的内容和讨论的[chronic]Microsoft bug。