Вы, кажется, использует 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();
}
}
}
Кроме этого вам необходимо будет использовать некоторые специфические интерфейсы драйвера низкого уровня операционной системы, но я не знаком ни с одной из них.
Я попытался сделать это, но у меня есть для обеих версий 1.0, вы знаете некоторые API более низкого уровня, чтобы проверить это? –
@MatthiasRoekoe Я обновил свой ответ с примером кода, который использует PCSC API. – jariq
Можете ли вы добавить dll или что-то еще? –