Winlogon notification package

Теорія та практика

Автор: Роман Бурда Джерело: RSDN Magazine #1-2006

notification

Що це таке

В операційних системах лінії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 із обробником – асинхронно чи синхронно.