Перехват события log of из сервиса
От: MindGHost Россия  
Дата: 25.10.13 15:36
Оценка:
Добрый вечер!

Сразу к делу:
Есть сервис, которому необходимо при завершении пользовательской сессии изменить некоторые ключи в реестре.
Отсюда вопрос — как в сервисе узнать о надвигающемся log of?

Пробовал SetConsoleCtrlHandler и CTRL_LOGOFF_EVENT. Для консольного варианта работает, как запускаю в виде службы — даже в обработчик ничего не падает.
Пробовал RegisterServiceCtrlHandlerEx, ServiceCtrlHandlerEx и SERVICE_CONTROL_SESSIONCHANGE. Работает, однако при получении этого эвента сессия уже мертвенькая и в реестр пользователя не попасть.
Дополнительный exe со скрытым окном или консолью в каждой пользовательской сессии тоже не вариант по некоторым причинам.

Отсюда следующий вопрос: Неужели в Windows нет оповещения служб о завершении сеанса работы пользователя? не может же такого быть, чтобы ни одной службу не надо было что-то сохранить\изменить для завершающего работу пользователя?

Заранее благодарю за ответы и комментарии.

28.10.13 11:52: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Не судите строго — я еще учусь.
Re: Перехват события log of из сервиса
От: okman Беларусь https://searchinform.ru/
Дата: 25.10.13 16:52
Оценка:
Здравствуйте, 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 до уничтожения сессии).
Re[2]: Перехват события log of из сервиса
От: MindGHost Россия  
Дата: 25.10.13 17:12
Оценка:
Здравствуйте, 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".
Не судите строго — я еще учусь.
Re[3]: Перехват события log of из сервиса
От: okman Беларусь https://searchinform.ru/
Дата: 25.10.13 18:02
Оценка:
Здравствуйте, 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 весьма скромные.
Re[4]: Перехват события log of из сервиса
От: MindGHost Россия  
Дата: 25.10.13 18:40
Оценка:
Здравствуйте, 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
Спасибо. Почитаю.
Не судите строго — я еще учусь.
Re[5]: Перехват события log of из сервиса
От: Kubyshev Andrey  
Дата: 28.10.13 10:10
Оценка:
O>>А почему нельзя писать в реестр после logoff ?
MGH>Так ведь веток реестра пользователя уже не существует. А редактировать файл реестра конкретного пользователя я пока не умею.

А как же HKEY_USERS ? HKEY_CURRENT_USER это просто редиректус.
Re: Перехват события log of из сервиса
От: ononim  
Дата: 28.10.13 12:49
Оценка: 8 (2)
А почему так принципиально записать чтото именно при логоффе, а не при логоне, например?
Или записать при логоффе, но не в юзерский реестр, а в HKLM.
Ну и если уж так жжет в одном месте — можно узнать путь к файлу хива юзерского реестра и подмонтировать его "для себя" при логоффе юзера. Но тут потребуется учесть тонкости с profile roaming и временными профилями.
Как много веселых ребят, и все делают велосипед...
Re[6]: Перехват события log of из сервиса
От: ononim  
Дата: 28.10.13 12:52
Оценка: 13 (2)
O>>>А почему нельзя писать в реестр после logoff ?
MGH>>Так ведь веток реестра пользователя уже не существует. А редактировать файл реестра конкретного пользователя я пока не умею.
KA>А как же HKEY_USERS ? HKEY_CURRENT_USER это просто редиректус.
После зевершения сессии хив юзера отмонтируется из HKEY_USERS, если никому не нужен. Кстати, возможно стоит покопать в сторону как заставить системы попридержать хив — там счетчик ссылок, по идее LoadUserProfile&Co должен помочь.
Как много веселых ребят, и все делают велосипед...
Re[6]: Перехват события log of из сервиса
От: MindGHost Россия  
Дата: 28.10.13 15:28
Оценка:
Здравствуйте, Kubyshev Andrey, Спасибо за ответ. Вы писали:

KA>А как же HKEY_USERS ? HKEY_CURRENT_USER это просто редиректус.


спасибо, я в курсе. Но если сессия пользователя умерла, то и куст реестра тоже умер, и в HKCU и в HKEY_USERS.
Для службы вообще не существует HKCU активного пользователя, посему только через HKEY_USERS и приходится работать.
Не судите строго — я еще учусь.
Re[2]: Перехват события log of из сервиса
От: MindGHost Россия  
Дата: 28.10.13 15:35
Оценка:
Здравствуйте, ononim, Вы писали:

O>А почему так принципиально записать чтото именно при логоффе, а не при логоне, например?

O>Или записать при логоффе, но не в юзерский реестр, а в HKLM.

Ну надо вот, после уже поздно.

O>Ну и если уж так жжет в одном месте — можно узнать путь к файлу хива юзерского реестра и подмонтировать его "для себя" при логоффе юзера. Но тут потребуется учесть тонкости с profile roaming и временными профилями.


На данный момент именно так и делаю. А вот такие профили я не учел, надо их поковырять. Спасибо.
Не судите строго — я еще учусь.
Re: Перехват события log of из сервиса
От: x64 Россия  
Дата: 28.10.13 18:47
Оценка:
MGH>Заранее благодарю за ответы и комментарии.

До кучи: вот это ещё можешь попробовать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.