Tuesday, February 09, 2010

Вход в систему по подключению определенной флешки

Одним ужасным пятничным вечером мне стало интересно как реализован вход в систему(Windows 7) по отпечатку пальца, так часто использующийся на ноутбуках. Что меня большего всего интересовало – как сделана такая прозрачная интеграция с WinLogon(механизм входа в систему).

С помощью знакомого я узнал что сие называется Credential Provider(по крайней мере начиная с Vista, до неё – был другой механизм). И тут-то я вспомнил что давно хотел сделать чтобы система разблокировалась при подключении одной определенной флешки. Поэтому я захотел быстренько наваять такой проект.

Первое что я сделал – это поискал примеры реализации Credential Provider. Они быстро нашлись в Windows SDK, а так же отдельно примеры(но устаревшие – для висты).

Среди примеров был наиболее близкий мне – SampleHardwareEventCredentialProvider.

Расскажу вкратце как устроен механизм провайдеров учетных записей(Credential Provider).

В реестре(HKLM\Software\Microsoft Windows\CurrentVersion\Authentification) есть две ветки – собственно Credential Providers и Credential Provider Filters. В каждом из них набор вида “ветка-GUID”(GUID – уникальный идентификатор) с дефолтным параметром – названием провайдера или фильтра. Тут надо пояснить что такое провайдеры и фильтры.

Провайдер – он дает нам возможность входа в систему. Например по отпечатку пальца, по вводу пароля(дефолтное поведение), по смарткарте, и т.д.

Фильтры – фильтруют “лишнее” поведение от пользователя. Пример – если политикой безопасности запрещен вход по смарткарте – фильтр может отключить такой провайдер.

Далее, в реестре в всем известном страшном месте HKCR\CLSID описаны GUIDы, а в нашем случае – для идентификаторов фильтров и провайдеров прописаны их названия, название файла — dll-ки, и модель потоков(ThreadingModel=Apartment).

Read more: habrahabr.ru

Posted via email from jasper22's posterous