2014-10-24 3 views
0

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

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

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

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

Спасибо

ответ

1

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

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

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

Любой лучшее решение?