Список всех считывателей смарт-карт в системе (проблемы со считывателем Alcor Micro)

У меня это программное обеспечение работает уже много лет, и я никогда раньше не сталкивался с этой проблемой. Я только что получил новый ноутбук (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.

Спасибо!


person Adam Plocher    schedule 11.04.2013    source источник
comment
Никогда не наблюдал такого эффекта у ридеров здесь. Для бесконтактного ридера это было бы особенно противно. Я бы пожаловался в Alcor или HP, чтобы получить обновление драйвера, поскольку единственной альтернативой было бы спуститься с уровня winscard.dll (т.е. диспетчера ресурсов) к перечислению USB-устройств.   -  person guidot    schedule 12.04.2013
comment
@guidot Спасибо за ваш ответ. Да, я много лет работаю с читателями и никогда не видел такого поведения. Как я уже сказал, он делает то же самое в диспетчере устройств в Windows - он отображается как неактивный, пока карта не будет вставлена, так что это определенно похоже на что-то на уровне драйвера / оборудования, а не на мой код ... Я думаю, что возьму свой совет и отправьте Alcor электронное письмо.   -  person Adam Plocher    schedule 12.04.2013
comment
Проверьте, запущены ли службы смарт-карт..........   -  person vikky    schedule 15.04.2013
comment
Он работает. У меня подключено несколько внешних USB-ридеров (один через принтер и один автономно). Эти два появляются, но внутренний на моем ноутбуке не появляется, пока я не вставлю смарт-карту. Он ведет себя так же и в диспетчере устройств - он отображается как неактивный кард-ридер, пока я не вставлю карту - как если бы USB был отключен (хотя в моем ноутбуке это внутренний кард-ридер USB). Я думаю, что это как-то связано с этим производителем/моделью. Я отправил им письмо несколько дней назад и не получил ответа...   -  person Adam Plocher    schedule 15.04.2013
comment
Это очень противное поведение. Я бы, конечно, пожаловался. Похоже, разработчики драйвера выбрали ярлык.   -  person Maarten Bodewes    schedule 17.04.2013
comment
Ну, я пытался связаться с ними около месяца назад, и до сих пор нет ответа. Я собираюсь открыть награду за это и посмотреть, есть ли у кого-нибудь опыт с этим. Спасибо   -  person Adam Plocher    schedule 15.05.2013


Ответы (1)


Хорошо, я чувствую себя очень глупо, найдя ответ сразу после открытия награды. Я некоторое время смотрел на это с точки зрения программного обеспечения и на некоторое время сдался - когда я вернулся, чтобы пересмотреть это, я решил, что это может подойти для награды.

Я решил поближе взглянуть на параметры моего BIOS, и знаете что? Там есть опция «Включить устройство чтения смарт-карт: а) когда карта вставлена, б) всегда». Я изменил его на «Всегда», и это работает. АРХ

Это не позволит мне удалить мой вопрос, так как теперь у него есть награда, но в основном это мой ответ. Спасибо за комментарии/советы.

person Adam Plocher    schedule 14.05.2013
comment
Спасибо вам большое за размещение этого. Вы сэкономили мне часы, задаваясь вопросом, почему он это делает и почему мой код, который работал сейчас, не работает. - person darbid; 15.12.2018
comment
См. также Как перечислить сертификаты на смарт-карте в MSDN и обсуждаемая [хроническая] ошибка Microsoft. - person jww; 24.09.2019