Служба уведомлений Winlogon перед загрузкой ntuser.dat

#authentication #winapi #notifications #winlogon

#аутентификация #winapi #уведомления #winlogon

Вопрос:

Я пытаюсь создать службу уведомлений Winlogon, которая получает сообщение о входе в систему, а затем копирует ntuser.dat (реестр) из центрального расположения (как это делает перемещаемый профиль) и при выходе из системы возвращает это (копирует ntuser.dat в центральное расположение). Я уже создал службу, и она получает SENS-сообщение, но я думаю, что сообщения SENS принимаются ПОСЛЕ загрузки ntuser.dat; поэтому я получаю «сообщение об использовании файла», пытающееся взаимодействовать с ntuser.dat. Я думаю, что SENS — это не способ сделать это, но старый hklm xxx x x winlogon notify не работает в Windows Vista и выше. Итак, я здесь заблудился.

Как я могу использовать службу или DLL, чтобы остановить процесс входа в систему, пока я не перемещу ntuser.dat в профиль пользователя?

Заранее спасибо.


После долгих исследований (документация очень старая и устаревшая) Я понял, почему SENS (служба уведомлений о системных событиях) не работает для этой задачи.

Служба SENS находится на один уровень ниже служб уведомлений Winlogon, фактически, сама SENS является службой, зарегистрированной в Winlogon для получения уведомлений, а затем SENS информирует все службы, которые реализуют COM-интерфейсы этого второго уровня, об изменениях в состояниях сеансов, таких как вход в систему, выход из системы и т.д.

Служба профилей пользователей (ProfSvc) также является службой, которая, как и SENS, получает уведомления от Winlogon и отвечает за выполнение политик и перемещений NTUSER.DAT и другие проблемы, связанные с реестром и профилем пользователя.

Проведя еще немного расследования, я обнаружил, что существует раздел реестра, который управляет поведением этих служб:

 HKLM  System  CurrectControlSet  Control  Winlogon  Notifications  Configurations
  

И порядок загрузки или вызова этих служб включен:

 HKLM  System  CurrectControlSet  Control  Winlogon  Notifications  Configurations  Default 
  

Под этим ключом находятся некоторые REG_SZ с возможными событиями, такими как: Вход в систему, выход из системы, завершение работы, разблокировка и т.д., А содержимое представляет собой разделенную запятыми строку с именем службы, которую нужно загрузить для уведомления.

Я создаю службу и добавляю разделы реестра, и могу заставить winlogon попытаться вызвать мою службу, но процесс входа в систему был остановлен с ошибкой, подобной этой:

Идентификатор события: 6001 Описание: Подписчику winlogon notification не удалось выполнить событие уведомления.

Идентификатор события: 6004 Описание: Подписчику winlogon notification не удалось выполнить критическое событие уведомления.

Я не знаю, что ответить или какие COM-объекты реализовать, чтобы получить событие и ответить…

Моя служба уже выполняется перед службой профилей, поэтому, если я могу ответить Winlogon, мне удалось решить пользовательскую службу перемещаемых профилей для Windows.

Кто-нибудь?

Комментарии:

1. Вы говорите об этом ?

Ответ №1:

Взгляните на HandlerEx функции служб.

Одним из управляющих событий является SERVICE_CONTROL_SESSIONCHANGE .

Если dwControl имеет значение SERVICE_CONTROL_SESSIONCHANGE, этот параметр может быть одним из значений, указанных в параметре wParam сообщения WM_WTSESSION_CHANGE.

ее параметром dwEventType будет один из WTS_SESSION_LOGON и WTS_SESSION_LOGOFF (как описано здесь и здесь)

Комментарии:

1. но это все та же проблема, WTS_SESSION_LOGON находится под TermSrv (который является библиотекой удаленного рабочего стола)… Мне нужно иметь возможность создать библиотеку типа «Подписчик уведомлений Winlogon», такую же, как SENS, GPClient, SessionEnv, TermSrv и т.д…