Можно ли заметить изменение моего софта в хранилище сертификатов Windows? (.СЕТЬ)

Как следует из названия, я хочу знать, есть ли какое-то событие, которое нужно узнать, когда изменилось хранилище сертификатов.

Цель состоит в том, чтобы определить, когда пользователь вводил USB-карту определенного типа / карту памяти с сертификатом / токеном для подписи. Сертификат регистрируется в Windows Cert Store, ("Мой", личные сертификаты).

Мне не нравится идея обнаружения событий USB, потому что существует переменная задержка между моментом, когда ключ подключен, и моментом, когда сертификат фактически зарегистрирован (и пригоден для использования).

Конечно, я всегда могу установить таймер, который проверяет магазин каждые 10 секунд или около того, но я надеюсь, вы согласитесь, что это не элегантное решение. Конечно, если нет другого хорошего варианта, я думаю, это то, что я в конечном итоге сделаю.

Спасибо

2 ответа

Как насчет гибридного подхода? Следите за событиями USB, затем, когда USB-ключ подключен, начинайте опрашивать магазин каждые пару секунд, пока не увидите новый сертификат. Все еще не идеал, но гораздо ближе к нему, чем тупой опрос каждые десять секунд, 24/7/365.

Хитрость заключается в том, чтобы знать, когда USB-ключ относится к тому типу, который в конечном итоге зарегистрирует сертификат. Если вы можете узнать это в обработчике событий USB, то проверьте это, и если пользователь подключает обычную флешку, не начинайте опрос. Если вы не можете этого знать, то при обнаружении нового соединения вы можете опросить хранилище сертификатов только за минуту до того, как откажетесь.

У меня та же проблема.

Я временно решил ее, подождав, пока смарт-карта больше не будет передана другому процессу (службе распространения сертификатов). Не очень хорошо, и надежность тоже под вопросом, но пока работает.

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

Кто-нибудь с лучшим решением?

Другие вопросы по тегам