2014-10-24 8 views
0

제목에서 알 수 있듯이 인증서 저장소가 변경된시기를 파악하기 위해 어떤 종류의 이벤트가 있는지 알고 싶습니다.Windows 인증서 저장소에서 변경된 내용을 제 소프트에서 확인할 수 있습니까? (.NET)

목표는 사용자가 특정 종류의 USB 스마트 카드/스틱에 서명 인증서/토큰을 입력했을 때이를 감지하는 것입니다. 인증서는 Windows Cert Store ("My", personnal certificates)에 등록됩니다.

키가 꽂혀있는 순간과 인증서가 실제로 등록되고 사용 가능한 순간 사이에 가변적 인 지연이 있기 때문에 USB 이벤트를 감지하는 아이디어를 좋아하지 않습니다.

물론 나는 매 10 초마다 상점을 확인하는 타이머를 설정할 수 있습니다.하지만 나는 그것이 우아한 해결책이 아니라는 점에 동의하길 바랍니다. 물론 다른 좋은 옵션을 사용할 수 없다면, 내가 추측하는대로 끝낼 것입니다.

고맙습니다.

답변

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

누구?