Winlogon notification package
Теорія та практика
Автор: Роман Бурда Джерело: RSDN Magazine #1-2006

Що це таке
В операційних системах лінії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,, де її можна знайти, і які події вона оброблятиме. Вся інформація розміщується у системному реєстрі в ключі
Повний доступ до нього мають лише користувачі із правами локального адміністратора. Звичайні користувачі не можуть створювати або змінювати підключення та/або значення.
Для того щоб підписати динамічну бібліотеку на подіїWinlogon,необхідно створити підключ із довільним ім'ям, після чого вказати значення в ньому:
- DllName(REG_EXPAND_SZ) – ім'я бібліотеки, що міститьnotification package, наприкладNotify.dll;
- Impersonate(REG_DWORD) – вказує, чи повинен бути імперсонований контекст безпеки користувача, коли Winlogon викликає функцію-обробник. (1 – повинен бути імперсонований, 0 – не повинен).
- Asynchronous(REG_DWORD) – вказує, чи має процес Winlogon створювати окремий потік для виклику функції-обробника (1 – створювати окремий потік, 0 – не створювати). Фактично, це значення вказує, як працюватиме Winlogon із обробником – асинхронно чи синхронно.