Пакет за уведомяване на Winlogon
Теория и практика
Автор: Роман Бурда
Източник: Списание RSDN №1-2006

Какво е
Онлайн операционни системи Windows NT поддръжката за влизане в диалоговия прозорец се реализира с помощта Winlogon. Той осигурява разнообразни полезни интерфейси. Най-известният е GINA (Graphical Identification and Authentication dll), което обикновено се използва, когато трябва да промените стандартния метод за удостоверяване. Например за прилагане на възможността за влизане в системата с помощта на пръстови отпечатъци, ретина или електронна карта. По-малко известен, но също толкова полезен е Пакет за уведомяване на Winlogon. Този интерфейс реализира възможността за обработка на събития за влизане и излизане на потребители, включване и изключване на операционната система и някои други. За съжаление, последният интерфейс е реализиран само в операционни системи Win2000 и по-нови версии.
Пакет за уведомяване на Winlogon Създават ли се dll библиотеки, които получават и обработват събития Winlogon.
- Вписвам се - генерира се, когато потребителят влезе през Winlogon + GINA (чрез конзола, терминал и т.н.). Съобщенията няма да дойдат, ако потребителят е влязъл чрез LogonUser.
- Излизане - генерира се, когато потребителят излезе (ако е влязъл чрез Winlogon + GINA).
- Започвам - генерирани при стартиране на системата, както и при свързване на терминален клиент.
- Изключвам - генерирани преди изключване на системата, както и при изключване на терминалния клиент.
- StartScreenSaver - генерира се при стартиране на скрийнсейвъра. Забранено е да се показва потребителският интерфейс в манипулатора на това събитие.
- StopScreenSaver - генерира се, когато скрийнсейвърът спре. Забранено е да се показва потребителският интерфейс в манипулатора на това събитие.
- Ключалка - генерира се, когато потребителят заключи работната станция.
- Отключете - генерира се, когато потребителят отключи работната станция или когато системният администратор отключи заключването, принуждавайки потребителя да излезе.
- StartShell - генерирани след като потребителят е влязъл в системата и са установени мрежови връзки.
За изпълнение Пакет за уведомяване на Winlogon необходимо е следното.
Първо, трябва да създадете динамична библиотека, която да импортира набор от функции за обработка на събития. Прототипът на тези функции трябва да следва шаблона:
Както можете да видите, цялата информация за данните за събитието се съхранява в структурата WLX_NOTIFICATION_INFO.
В тази структура:
- Размер - определя размера на структурата в байтове;
- Знамена - полето е запазено и трябва да бъде настроено на 0;
- Потребителско име - низ, дефиниращ името на текущия потребител. Ако събитието се е случило преди потребителят да влезе, това поле е НУЛА;
- Домейн - низ, който указва името на домейна, в който е влязъл текущият потребител. Ако събитието се е случило преди потребителят да влезе, тогава това поле е НУЛА;
- WindowStation - дефинира името на прозоречната станция, в която работи текущият потребител. Ако събитието се е случило преди потребителят да влезе, това поле е НУЛА;
- hToken - дескриптор жетон-и потребителя. Ако събитието се е случило преди потребителят да влезе, това поле е НУЛА;
- hDesktop - дескриптор Работен плот 'и за текущото събитие;
- pStatusCallback - запазено за вътрешна употреба.
След създаването на динамичната библиотека трябва да посочите Winlogon, къде може да бъде намерен и с какви събития ще се справи. Цялата информация се поставя в системния регистър в ключа
Само потребители с права на местен администратор имат пълен достъп до него. Обикновените потребители няма да могат да създават или променят подключове и/или стойности.
За да абонирате динамична библиотека за събития Winlogon, трябва да създадете подключ с произволно име и след това да посочите стойностите в него:
- DllName (REG_EXPAND_SZ) - името на библиотеката, съдържаща пакет за уведомяване, напр Notify.dll;
- Представете се (REG_DWORD) Показва дали контекстът на защита на влезлия потребител трябва да се представя, когато Winlogon извиква функцията манипулатор. (1 - трябва да се представя за себе си, 0 - не трябва).
- Асинхронно (REG_DWORD) - показва дали процесът Winlogon трябва да създаде отделна нишка за извикване на функцията манипулатор (1 - създайте отделна нишка, 0 - не създавайте). Всъщност тази стойност определя как Winlogon ще работи с манипулатора - асинхронно или синхронно.