Russian Qt Forum

Программирование => Общий => Тема начата: QuAzI от Декабрь 22, 2010, 14:37



Название: Watch User Log In
Отправлено: QuAzI от Декабрь 22, 2010, 14:37
Нужно держать сервис, морда которого была бы доступна через системный трей. Как отловить момент входа (логина) пользователя и проверить, кто сейчас активный юзверь?


Название: Re: Watch User Log In
Отправлено: crackedmind от Декабрь 23, 2010, 12:59
Чтобы много не писать, дам ссылочку.
http://www.rsdn.ru/article/baseserv/winlogon.xml


Название: Re: Watch User Log In
Отправлено: QuAzI от Декабрь 23, 2010, 15:49
Огромное спасибо. А чего-нить аналогичного покурить под юних не ткнёте?


Название: Re: Watch User Log In
Отправлено: crackedmind от Декабрь 23, 2010, 20:39
Про юних я не в курсе :)


Название: Re: Watch User Log In
Отправлено: QuAzI от Декабрь 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 написано что он зарезервирован для внутренних нужд. Объявил как сообразил.


Название: Re: Watch User Log In
Отправлено: Fat-Zer от Декабрь 28, 2010, 04:03
А если банально морду в авторан на логин юзера поставить? (KISS man!)
Или я не правильно понял задачу?


Название: Re: Watch User Log In
Отправлено: QuAzI от Декабрь 28, 2010, 08:40
Да я бы хотел, но сказали оформить "как сервис доступный из трея". Само собой пока юзверь не залогинится бесполезно ломиться в трей, к тому же там конфиг, который в параметрах пользователя хранится. Т.е. оптимально было бы к этому событию привязаться. А уже в подробности реализации "сервиса" я думаю мало кто будет вникать.


Название: Re: Watch User Log In
Отправлено: crackedmind от Декабрь 28, 2010, 08:50
Цитировать
Нифига энтот WinLogon не хочет срабатывать. Набросал либу с одной экспортируемой функцией. Указываю её в реестре хоть в Logon, хоть в StartShell. Ни приложение не стартует, которое должно ей вызываться, ни в лог не пишет.
Если делать как в статье, то все работает. Лично проверял =)

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

Читай внимательнее в каком разделе реестра какие ключи надо создать, чтобы он сработал.


Название: Re: Watch User Log In
Отправлено: QuAzI от Декабрь 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 одноимённая событию.


Название: Re: Watch User Log In
Отправлено: crackedmind от Декабрь 28, 2010, 11:09
Цитировать
Где StartShell - функция из dll одноимённая событию.
ну функцию ты как хочешь можешь обозвать, но имя ключа должно быть предопределенное Logon, Logoff и прочие.
Также проверь, отключил ли ты манглинг имен.


Название: Re: Watch User Log In
Отправлено: QuAzI от Декабрь 28, 2010, 11:19
Опа... для самых серых и несведущих... что такое манглин?


Название: Re: Watch User Log In
Отправлено: crackedmind от Декабрь 28, 2010, 11:28
упс, манглинг :) http://en.wikipedia.org/wiki/Name_mangling


Название: Re: Watch User Log In
Отправлено: QuAzI от Декабрь 28, 2010, 11:59
Вроде понял о чём речь.
Из слинкованной dll, если смотреть сторонним софтом, экспортируется _CRT_MT и StartShell. Откуда _CRT_MT взялся не знаю, но StartShell экспортируется без абракадабры, да и rundll32 его бы не запускала вообще, писала бы что функции нет, если бы в имени вопрос был.


Название: Re: Watch User Log In
Отправлено: crackedmind от Декабрь 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


Название: Re: Watch User Log In
Отправлено: QuAzI от Декабрь 29, 2010, 01:29
Фигня пролечилась после того как положил нужные dll не в директорию с запускаемой библой, а в windows\system32
Конкретнее
QtCore4.dll
mingwm10.dll
libgcc_s_dw2-1.dll
Как-то это не красиво смотрится. Придётся "гадить" туда, куда обычно приличные проги не пишут.


Название: Re: Watch User Log In
Отправлено: QuAzI от Июнь 10, 2011, 17:21
Опять проблемы с аналогичной библиотечкой (исходники в аттаче). WinLogon её подхватывает при загрузке (удалить её нельзя), но ни в файл-лог, ни к SQL-серверу ничего не приходит, а должно бы по идее.
Библиотеки все нужные лежат в SYSTEM32
Есть какие мысли у кого, как это пролечить?