我的软件可以注意到Windows证书库中的更改吗? (。净)

时间:2014-10-24 14:55:47

标签: c# .net events event-handling certificate-store

正如标题所暗示的那样,我想知道在证书存储区发生变化时是否有某种事件需要了解。

目标是检测用户何时输入特定类型的USB智能卡/棒,其中包含签名证书/令牌。证书在Windows Cert Store中注册(“我的”,个人证书)。

我不喜欢检测USB事件的想法,因为在插入密钥的时刻与证书实际注册(并且可用)之间存在可变延迟。

当然,我总是可以设置一个每隔10秒左右检查一次商店的计时器,但我希望你会同意这是一个不优雅的解决方案。当然,如果没有其他好的选择,那就是我最终会做的事情。

谢谢

2 个答案:

答案 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();
}

任何有更好解决方案的人?