我在我的 wpf 项目中使用 pkcs11 dll,但我想知道我的 eID 阅读器有什么驱动程序/软件版本,所以如果它是旧版本,我们可以弹出“更新你的 eID 阅读器驱动程序”
部分代码:
_pkcs11 = new Pkcs11("beidpkcs11.dll", false);
LibraryInfo Lib = _pkcs11.GetInfo();
DllVersion = Lib.CryptokiVersion;
您似乎通过托管Pkcs11Interop包装器使用 PKCS#11 API 来访问您的 eID 卡,但 IMO 此 API 不提供有关您的智能卡读卡器驱动程序版本的信息。最好的办法是尝试检查HardwareVersion
和/或包含有关智能卡阅读器信息FirmwareVersion
的类的属性SlotInfo
(在 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
}
}
您也可以尝试使用 PC/SC 接口的一部分功能读取阅读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();
}
}
}
除此之外,您需要使用一些特定于操作系统的低级驱动程序 API,但我对其中的任何一个都不熟悉。