Russian Qt Forum
Ноябрь 23, 2024, 10:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Watch User Log In  (Прочитано 8084 раз)
QuAzI
Гость
« : Декабрь 22, 2010, 14:37 »

Нужно держать сервис, морда которого была бы доступна через системный трей. Как отловить момент входа (логина) пользователя и проверить, кто сейчас активный юзверь?
Записан
crackedmind
Гость
« Ответ #1 : Декабрь 23, 2010, 12:59 »

Чтобы много не писать, дам ссылочку.
http://www.rsdn.ru/article/baseserv/winlogon.xml
Записан
QuAzI
Гость
« Ответ #2 : Декабрь 23, 2010, 15:49 »

Огромное спасибо. А чего-нить аналогичного покурить под юних не ткнёте?
Записан
crackedmind
Гость
« Ответ #3 : Декабрь 23, 2010, 20:39 »

Про юних я не в курсе Улыбающийся
Записан
QuAzI
Гость
« Ответ #4 : Декабрь 28, 2010, 03:37 »

Нифига энтот WinLogon не хочет срабатывать. Набросал либу с одной экспортируемой функцией. Указываю её в реестре хоть в Logon, хоть в StartShell. Ни приложение не стартует, которое должно ей вызываться, ни в лог не пишет. Если запустить так
rundll32 tray_service_launcher.dll,StartShell
То в лог успевает написать перед тем как брякнуться из-за ошибочного токена юзверя. Если меняю CreateProcessAsUser на CreateProcess из Kernel32, то всё работает, но так не будет запускать приложение из под залогинившегося юзверя.

Подозреваю, что косяк может быть в структуре
Код:
typedef struct _WLX_NOTIFICATION_INFO
{
  ULONG  Size ;
  ULONG  Flags ;
  PWSTR  UserName ;
  PWSTR  Domain ;
  PWSTR  WindowStation ;
  HANDLE hToken ;
  HDESK  hDesktop ;
  ULONG pStatusCallback; // PFNMSGECALLBACK
} WLX_NOTIFICATION_INFO, * PWLX_NOTIFICATION_INFO ;
  pStatusCallback должен быть определён как PFNMSGECALLBACK, но я не нашёл описания этого типа и в MSDN написано что он зарезервирован для внутренних нужд. Объявил как сообразил.
Записан
Fat-Zer
Гость
« Ответ #5 : Декабрь 28, 2010, 04:03 »

А если банально морду в авторан на логин юзера поставить? (KISS man!)
Или я не правильно понял задачу?
« Последнее редактирование: Декабрь 28, 2010, 04:06 от Fat-Zer » Записан
QuAzI
Гость
« Ответ #6 : Декабрь 28, 2010, 08:40 »

Да я бы хотел, но сказали оформить "как сервис доступный из трея". Само собой пока юзверь не залогинится бесполезно ломиться в трей, к тому же там конфиг, который в параметрах пользователя хранится. Т.е. оптимально было бы к этому событию привязаться. А уже в подробности реализации "сервиса" я думаю мало кто будет вникать.
Записан
crackedmind
Гость
« Ответ #7 : Декабрь 28, 2010, 08:50 »

Цитировать
Нифига энтот WinLogon не хочет срабатывать. Набросал либу с одной экспортируемой функцией. Указываю её в реестре хоть в Logon, хоть в StartShell. Ни приложение не стартует, которое должно ей вызываться, ни в лог не пишет.
Если делать как в статье, то все работает. Лично проверял =)

Цитировать
pStatusCallback должен быть определён как PFNMSGECALLBACK, но я не нашёл описания этого типа и в MSDN написано что он зарезервирован для внутренних нужд. Объявил как сообразил.
вообще не трогай этот тип, раз зарезервирован.

Читай внимательнее в каком разделе реестра какие ключи надо создать, чтобы он сработал.
Записан
QuAzI
Гость
« Ответ #8 : Декабрь 28, 2010, 10:01 »

Мне казалось в реестре должно быть что-то типа этого
Код:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\media_tray]
"DLLName"="c:\\devel\\plzkurs2010.2\\bin\\tray_service_launcher.dll "
"Asynchronous"=dword:00000001
"Impersonate"=dword:00000001
"StartShell"="StartShell"
Где StartShell - функция из dll одноимённая событию.
Записан
crackedmind
Гость
« Ответ #9 : Декабрь 28, 2010, 11:09 »

Цитировать
Где StartShell - функция из dll одноимённая событию.
ну функцию ты как хочешь можешь обозвать, но имя ключа должно быть предопределенное Logon, Logoff и прочие.
Также проверь, отключил ли ты манглинг имен.
« Последнее редактирование: Декабрь 28, 2010, 11:28 от crackedmind » Записан
QuAzI
Гость
« Ответ #10 : Декабрь 28, 2010, 11:19 »

Опа... для самых серых и несведущих... что такое манглин?
Записан
crackedmind
Гость
« Ответ #11 : Декабрь 28, 2010, 11:28 »

упс, манглинг Улыбающийся http://en.wikipedia.org/wiki/Name_mangling
Записан
QuAzI
Гость
« Ответ #12 : Декабрь 28, 2010, 11:59 »

Вроде понял о чём речь.
Из слинкованной dll, если смотреть сторонним софтом, экспортируется _CRT_MT и StartShell. Откуда _CRT_MT взялся не знаю, но StartShell экспортируется без абракадабры, да и rundll32 его бы не запускала вообще, писала бы что функции нет, если бы в имени вопрос был.
Записан
crackedmind
Гость
« Ответ #13 : Декабрь 28, 2010, 14:10 »

Так вот экспортируешь функции под любыми именами, только чтобы соответствовало виндовому прототипу и привязываешь к нужным событиям. Их не так много.

у меня было так.
Цитировать
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify\myLogonNotify]
"DllName"="С:\\myLogonNotify.dll"
"Logon"="myEventLogon"
"Impersonate"=dword:00000000
"Asynchronous"=dword:00000000

И на событие event в лог писалось
Цитировать
Event: user logon, User: myLogin, Domain: MyDomain,Window station: WinSta0, User token 0x00000618,Desktop 0x000000B8
« Последнее редактирование: Декабрь 28, 2010, 14:12 от crackedmind » Записан
QuAzI
Гость
« Ответ #14 : Декабрь 29, 2010, 01:29 »

Фигня пролечилась после того как положил нужные dll не в директорию с запускаемой библой, а в windows\system32
Конкретнее
QtCore4.dll
mingwm10.dll
libgcc_s_dw2-1.dll
Как-то это не красиво смотрится. Придётся "гадить" туда, куда обычно приличные проги не пишут.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 20.