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