2014-12-24 7 views
0

Я использую dll pkcs11 в моем проекте wpf, но я хочу знать, какую версию драйвера/программного обеспечения у моего eID-читателя есть, если это старая версия, мы можем сделать всплывающее окно с «обновить драйвер для читателя Ид»Проверьте версию драйвера eID и узнайте, когда она является старой версией

части коды:

_pkcs11 = new Pkcs11("beidpkcs11.dll", false); 
LibraryInfo Lib = _pkcs11.GetInfo(); 
DllVersion = Lib.CryptokiVersion; 

ответ

0

Вы, кажется, использует PKCS # 11 API с помощью управляемых Pkcs11Interop обертки чтобы получить доступ к Ид карты, но ИМО этот API не предоставляет информацию о версии вашего драйвера считывателя смарт-карт. Ваш лучший выстрел, чтобы попытаться изучить HardwareVersion и/или FirmwareVersion свойства SlotInfo класса, который содержит информацию о вашей smarcard читателя (известный как слот в PKCS # 11), но эти поля имеют несколько иное значение:

using (Pkcs11 pkcs11 = new Pkcs11("beidpkcs11.dll", true)) 
{ 
    List<Slot> slots = pkcs11.GetSlotList(false); 
    foreach (Slot slot in slots) 
    { 
     SlotInfo slotInfo = slot.GetSlotInfo(); 
     // Examine slotInfo.HardwareVersion 
     // Examine slotInfo.FirmwareVersion 
    } 
} 

Вы можете также попробуйте прочитать атрибут читателя SCARD_ATTR_VENDOR_IFD_VERSION с функцией SCardGetAttrib(), которая является частью интерфейса ПК/ПК, но я не уверен, является ли возвращаемое значение версией драйвера или версией устройства. Следующий пример считывает этот атрибут с управляемым pcsc-sharp обертки:

using System; 
using PCSC; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var context = new SCardContext(); 
      context.Establish(SCardScope.System); 

      var readerNames = context.GetReaders(); 
      if (readerNames == null || readerNames.Length < 1) 
      { 
       Console.WriteLine("You need at least one reader in order to run this example."); 
       Console.ReadKey(); 
       return; 
      } 

      foreach (var readerName in readerNames) 
      { 
       var reader = new SCardReader(context); 

       Console.Write("Trying to connect to reader.. " + readerName); 

       var rc = reader.Connect(readerName, SCardShareMode.Shared, SCardProtocol.Any); 
       if (rc != SCardError.Success) 
       { 
        Console.WriteLine(" failed. No smart card present? " + SCardHelper.StringifyError(rc) + "\n"); 
       } 
       else 
       { 
        Console.WriteLine(" done."); 

        byte[] attribute = null; 
        rc = reader.GetAttrib(SCardAttribute.VendorInterfaceDeviceTypeVersion, out attribute); 
        if (rc != SCardError.Success) 
         Console.WriteLine("Error by trying to receive attribute. {0}\n", SCardHelper.StringifyError(rc)); 
        else 
         Console.WriteLine("Attribute value: {0}\n", BitConverter.ToString(attribute ?? new byte[] { })); 

        reader.Disconnect(SCardReaderDisposition.Leave); 
       } 
      } 

      context.Release(); 
      Console.ReadKey(); 
     } 
    } 
} 

Кроме этого вам необходимо будет использовать некоторые специфические интерфейсы драйвера низкого уровня операционной системы, но я не знаком ни с одной из них.

+0

Я попытался сделать это, но у меня есть для обеих версий 1.0, вы знаете некоторые API более низкого уровня, чтобы проверить это? –

+0

@MatthiasRoekoe Я обновил свой ответ с примером кода, который использует PCSC API. – jariq

+0

Можете ли вы добавить dll или что-то еще? –

 Смежные вопросы

  • Нет связанных вопросов^_^