O>>>А почему нельзя писать в реестр после logoff ? MGH>>Так ведь веток реестра пользователя уже не существует. А редактировать файл реестра конкретного пользователя я пока не умею. KA>А как же HKEY_USERS ? HKEY_CURRENT_USER это просто редиректус.
После зевершения сессии хив юзера отмонтируется из HKEY_USERS, если никому не нужен. Кстати, возможно стоит покопать в сторону как заставить системы попридержать хив — там счетчик ссылок, по идее LoadUserProfile&Co должен помочь.
Как много веселых ребят, и все делают велосипед...
А почему так принципиально записать чтото именно при логоффе, а не при логоне, например?
Или записать при логоффе, но не в юзерский реестр, а в HKLM.
Ну и если уж так жжет в одном месте — можно узнать путь к файлу хива юзерского реестра и подмонтировать его "для себя" при логоффе юзера. Но тут потребуется учесть тонкости с profile roaming и временными профилями.
Как много веселых ребят, и все делают велосипед...
Сразу к делу:
Есть сервис, которому необходимо при завершении пользовательской сессии изменить некоторые ключи в реестре.
Отсюда вопрос — как в сервисе узнать о надвигающемся log of?
Пробовал SetConsoleCtrlHandler и CTRL_LOGOFF_EVENT. Для консольного варианта работает, как запускаю в виде службы — даже в обработчик ничего не падает.
Пробовал RegisterServiceCtrlHandlerEx, ServiceCtrlHandlerEx и SERVICE_CONTROL_SESSIONCHANGE. Работает, однако при получении этого эвента сессия уже мертвенькая и в реестр пользователя не попасть.
Дополнительный exe со скрытым окном или консолью в каждой пользовательской сессии тоже не вариант по некоторым причинам.
Отсюда следующий вопрос: Неужели в Windows нет оповещения служб о завершении сеанса работы пользователя? не может же такого быть, чтобы ни одной службу не надо было что-то сохранить\изменить для завершающего работу пользователя?
Заранее благодарю за ответы и комментарии.
28.10.13 11:52: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Здравствуйте, MindGHost, Вы писали:
MGH>Отсюда вопрос — как в сервисе узнать о надвигающемся log of? MGH>Пробовал RegisterServiceCtrlHandlerEx, ServiceCtrlHandlerEx и SERVICE_CONTROL_SESSIONCHANGE. Работает, однако при получении этого эвента сессия уже мертвенькая и в реестр пользователя не попасть.
Да, в MSDN неявно указывается, что сообщения типа WTS_SESSION_LOGOFF приходят уже
после того, как соответствующее событие произошло, то есть это post-callback.
MGH>Дополнительный exe со скрытым окном или консолью в каждой пользовательской сессии тоже не вариант по некоторым причинам.
А почему, интересно ?
Запустить скрытый процесс в сессии пользователя, ждать WM_ENDSESSION...
Можно еще c SetProcessShutdownParameters поиграться, наверное, чтобы процесс
получал это сообщение по возможности раньше остальных. Чем не вариант ?
MGH>Отсюда следующий вопрос: Неужели в Windows нет оповещения служб о завершении сеанса работы пользователя? не может же такого быть, чтобы ни одной службу не надо было что-то сохранить\изменить для завершающего работу пользователя?
Можно попробовать добавить событие в системный планировщик.
Или написать Winlogon Notification Package (для систем, предшествующих Windows Vista).
Но не уверен, что будет работать так, как требуется (поймать logoff до уничтожения сессии).
Здравствуйте, okman, спасибо за ответ. Вы писали:
O>Да, в MSDN неявно указывается, что сообщения типа WTS_SESSION_LOGOFF приходят уже O>после того, как соответствующее событие произошло, то есть это post-callback.
Согласен. Я это наковырял уже опытным путем. Но я не понимаю почему SetConsoleCtrlHandler и CTRL_LOGOFF_EVENT не работают.
Ведб в МСДН английским по белому написано:
"Note that this signal is received only by services. Interactive applications are terminated at logoff, so they are not present when the system sends this signal."
Хотя, с другой стороны, этот вариант может тоже оказаться post_callback, если "they are not present when the system sends this signal".
O>А почему, интересно ? O>Запустить скрытый процесс в сессии пользователя, ждать WM_ENDSESSION... O>Можно еще c SetProcessShutdownParameters поиграться, наверное, чтобы процесс O>получал это сообщение по возможности раньше остальных. Чем не вариант ?
Потому что дополнительный exe, который еще и антивирь какой-нить ограничит (Каспер вон пости про все подряд спрашивает), или юзвер грохнет ненароком или еще чего.
А "некорректный" (без записи определенных ключеф в реестре пользователя) выход обернется бякой для пользователя, для продукта и большой шишкой для меня. =)
Этот вариант резервный, так сказать. Все еще надеюсь что-нить придумать, или кто-нить что-нить подскажет.
O>Можно попробовать добавить событие в системный планировщик.
Не пробовал. А что туда можно воткнуть?
O>Или написать Winlogon Notification Package (для систем, предшествующих Windows Vista).
Сейчас рынок заполнен Win 7 в основном, так что тоже не вариант. Смотрел я в эту сторону и был глубоко разочарован увидев "not supported from Vista".
Здравствуйте, MindGHost, Вы писали:
MGH>А "некорректный" (без записи определенных ключеф в реестре пользователя) выход обернется бякой для пользователя, для продукта и большой шишкой для меня. =)
А почему нельзя писать в реестр после logoff ?
O>>Можно попробовать добавить событие в системный планировщик. MGH>Не пробовал. А что туда можно воткнуть?
Да много чего.
What's New in Task Scheduler http://msdn.microsoft.com/en-us/library/windows/desktop/aa384138(v=vs.85).aspx
O>>Или написать Winlogon Notification Package (для систем, предшествующих Windows Vista). MGH>Сейчас рынок заполнен Win 7 в основном, так что тоже не вариант. Смотрел я в эту сторону и был глубоко разочарован увидев "not supported from Vista".
Ну это запасной вариант. Возможности Task Scheduler на XP/Server 2003 весьма скромные.
Здравствуйте, okman, спасибо за ответ. Вы писали:
O>А почему нельзя писать в реестр после logoff ?
Так ведь веток реестра пользователя уже не существует. А редактировать файл реестра конкретного пользователя я пока не умею.
Как раз в эту сторону копаю. Если есть подсказка в этом направлении, тоже буду благодарен.
O>What's New in Task Scheduler O>http://msdn.microsoft.com/en-us/library/windows/desktop/aa384138(v=vs.85).aspx
Спасибо. Почитаю.
O>>А почему нельзя писать в реестр после logoff ? MGH>Так ведь веток реестра пользователя уже не существует. А редактировать файл реестра конкретного пользователя я пока не умею.
А как же HKEY_USERS ? HKEY_CURRENT_USER это просто редиректус.
Здравствуйте, Kubyshev Andrey, Спасибо за ответ. Вы писали:
KA>А как же HKEY_USERS ? HKEY_CURRENT_USER это просто редиректус.
спасибо, я в курсе. Но если сессия пользователя умерла, то и куст реестра тоже умер, и в HKCU и в HKEY_USERS.
Для службы вообще не существует HKCU активного пользователя, посему только через HKEY_USERS и приходится работать.
Здравствуйте, ononim, Вы писали:
O>А почему так принципиально записать чтото именно при логоффе, а не при логоне, например? O>Или записать при логоффе, но не в юзерский реестр, а в HKLM.
Ну надо вот, после уже поздно.
O>Ну и если уж так жжет в одном месте — можно узнать путь к файлу хива юзерского реестра и подмонтировать его "для себя" при логоффе юзера. Но тут потребуется учесть тонкости с profile roaming и временными профилями.
На данный момент именно так и делаю. А вот такие профили я не учел, надо их поковырять. Спасибо.