Реферат: Winlogon notification package. Теория и практика
Название: Winlogon notification package. Теория и практика Раздел: Рефераты по информатике, программированию Тип: реферат | ||||||||||||||||||||||||||||||
Winlogon notification package. Теория и практика Роман Бурда В операционных системах линии Windows NT диалоговая поддержка входа в систему реализована с помощью Winlogon. Он предоставляет целый ряд полезных интерфейсов. Наиболее известным является GINA (Graphical Identification and Authentication dll), который обычно используется, когда нужно изменить стандартный способ аутентификации. Например, реализовать возможность входа в систему по отпечаткам пальцев, сетчатке глаза или по электронной карточке. Менее известным, но не менее полезным является Winlogon notification package. Этот интерфейс реализует возможность обрабатывать события на вход и выход пользователей, включение и выключение операционной системы и некоторые другие. К сожалению, последний интерфейс реализован только в операционных системах Win2000 и выше. Winlogon notification package – это dll-библиотеки, которые получают и обрабатывают события, сгенерированные Winlogon. Logon – генерируется при входе пользователя в систему посредством Winlogon + GINA (через консоль, терминал и т. д.). Сообщения не будут приходить, если пользователь зашел посредством LogonUser. Logoff – генерируется при выходе пользователя из системы (если он вошел в систему посредством Winlogon + GINA). Startup – генерируется при запуске системы, а также при присоединении терминального клиента. Shutdown – генерируется перед выключением системы, а также при отсоединении терминального клиента. StartScreenSaver – генерируетсяпризапуске screen saver-а. В обработчике этого события запрещено показывать интерфейс пользователя. StopScreenSaver – генерируется при остановке screen saver-а. В обработчике этого события запрещено показывать интерфейс пользователя. Lock – генерируется, когда пользователь блокирует рабочую станцию. Unlock – генерируется, когда пользователь разблокировал рабочую станцию, или когда системный администратор снял блокировку, заставив пользователя выйти из системы. StartShell – генерируется после того, как пользователь зашел в систему и сетевые соединения были установлены. Для реализации Winlogon notification package необходимо следующее. Сначала нужно создать динамическую библиотеку, которая будет импортировать набор функций-обработчиков событий. Прототип этих функций должен строиться по шаблону:
Как видите, вся информация о данных события хранится в структуре WLX_NOTIFICATION_INFO.
В этой структуре: Size – определяет размер структуры в байтах; Flags – поле зарезервировано и должно устанавливаться в 0; UserName – строка, определяющая имя текущего пользователя. Если событие случилось до входа пользователя в систему, то это поле равно NULL; Domain – строка, которая определяет название домена, в который вошел текущий пользователь. Если событие случилось до входа пользователя в систему, то это поле равно NULL; WindowStation – определяет имя оконной станции, в которой текущий пользователь работает. Если событие случилось до входа пользователя в систему, то это поле равно NULL; hToken – дескриптор token-а пользователя. Если событие случилось до входа пользователя в систему, то это поле равно NULL; hDesktop – дескриптор Desktop’а для текущего события; pStatusCallback – зарезервировано для внутреннего использования. После создания динамической библиотеки нужно указать Winlogon, где ее можно найти, и какие события она будет обрабатывать. Вся информация размещается в системном реестре в ключе HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify Полный доступ к нему имеют только пользователи с правами локального администратора. Обыкновенные пользователи не смогут создавать или изменять подключи и/или значения.
Для того чтобы подписать динамическую библиотеку на события Winlogon, необходимо создать подключ с произвольным именем, после чего указать значения в нем: DllName (REG_EXPAND_SZ) – имя библиотеки, содержащей notification package, например Notify.dll; Impersonate (REG_DWORD) – указывает, должен ли быть имперсонирован контекст безопасности вошедшего пользователя, когда Winlogon вызывает функцию-обработчик. (1 – должен быть имперсонирован, 0 – не должен). Asynchronous (REG_DWORD) – указывает, должен ли процесс Winlogon создавать отдельный поток для вызова функции-обработчика (1 – создавать отдельный поток, 0 – не создавать). Фактически, это значение указывает, как будет работать Winlogon с обработчиком – асинхронно или синхронно. Следующие значения являются необязательными. Они определяют названия функций, которые будут обрабатывать одноименные события. То есть существует возможность подписаться не на все события, а только на некоторые. Все значения имеют тип REG_SZ. В таблице 1 приведены их названия и возможные значения.
Чтобы изменения вступили в силу, нужно перегрузить компьютер. Это объясняется тем, что Winlogon загружает dll перед загрузкой системы. Создадим в Visual Studio пример простой программы, ведущей логи сообщений Winlogon.
Создадим проект Win32 Dynamic-Link Library с именем Notify. Укажем визарду разновидность проекта – A simple DLL project. Итак, создан пустой проект. Укажем используемые заголовочные файлы.
Первый заголовочный файл хранит в себе прототип WLX_NOTIFICATION_INFO. А второй пригодится в процессе создания логов. У нас уже есть функция DllMain, любезно предоставленная визардом. Оставим ее без изменений. Напишем функцию создания логов. Поскольку структура WLX_NOTIFICATION_INFO содержит в себе Юникод-строки, будет удобно выводить данные в текстовый файл типа Юникод.
Теперь осталось написать функции-обработчики событий. Ради удобства назовем их так же, как показано в таблице 1.
Теперь необходимо экспортировать эти функции для других приложений. Для этого создадим файл Notify.def и добавим его в проект. В единственной секции EXPORTS укажем экспортируемые функции
После успешной компиляции необходимо подписаться на события Winlogon.
Для этого зайдем в реестр и отыщем ключ: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify Создадим в нем подключ MyNotify и значения, как показано на рисунке ниже. Рисунок 1. Для удобства поместим файл Notify.dll по указанному пути. После перезагрузки системы приложение начнет создавать логи.
Winlogon notification package может пригодиться в совершенно неожиданных местах. Например, если из системной службы необходимо получить имена пользователей, работающих в системе. Все, что нужно – это написать и зарегистрировать в системе dll, которая по запросу передаст данные в службу (или сама будет передавать эти данные в ответ на некоторые нужные события). Надеюсь, что данная статья расширит знания читателя об интерфейсах Winlogon, а также поможет использовать полученные знания на практике. |