正如标题所暗示的那样,我想知道在证书存储区发生变化时是否有某种事件需要了解。
目标是检测用户何时输入特定类型的USB智能卡/棒,其中包含签名证书/令牌。证书在Windows Cert Store中注册(“我的”,个人证书)。
我不喜欢检测USB事件的想法,因为在插入密钥的时刻与证书实际注册(并且可用)之间存在可变延迟。
当然,我总是可以设置一个每隔10秒左右检查一次商店的计时器,但我希望你会同意这是一个不优雅的解决方案。当然,如果没有其他好的选择,那就是我最终会做的事情。
谢谢
答案 0 :(得分:1)
混合方法怎么样?观察USB事件,然后在插入USB密钥时,每隔几秒钟开始轮询商店,直到看到新证书。仍然不理想,但比每10秒24/7/365的愚蠢调查更接近它。
技巧将是知道什么时候USB密钥是最终注册证书的特定类型。如果你可以在USB事件处理程序中知道这一点,那么检查它,如果用户插入普通的闪存驱动器,不要开始轮询。如果您不知道这一点,那么当您检测到新连接时,您可能只会在放弃之前轮询证书存储一分钟。
答案 1 :(得分:0)
我有同样的问题。
我暂时解决了这个问题,直到智能卡不再与另一个进程(证书传播服务)共享。不是很好,坚固性也值得怀疑,但它现在有效。
在C#中:
string selector = SmartCardReader.GetDeviceSelector();
DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(selector);
foreach (DeviceInformation device in devices)
{
SmartCardReader reader = await SmartCardReader.FromIdAsync(device.Id);
reader.CardAdded += ReaderOnCardAdded;
}
private static void ReaderOnCardAdded(SmartCardReader sender, CardAddedEventArgs args)
{
Task t = ReaderOnCardAddedAsync(sender, args);
t.Wait();
}
private static async Task ReaderOnCardAddedAsync(SmartCardReader sender, CardAddedEventArgs args)
{
SmartCardProvisioning provisioning = await SmartCardProvisioning.FromSmartCardAsync(args.SmartCard);
SmartCardStatus status;
do
{
status = await provisioning.SmartCard.GetStatusAsync();
Thread.Sleep(100);
} while (status == SmartCardStatus.Shared);
PrintCertificatesOrDoSomethingElseUseful();
}
任何有更好解决方案的人?