#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 и т.д…