Аннотация:
Рассматривается использование Winlogon notification package для обработки событий входа и выхода пользователей, включения и выключения операционной системы и некоторых других.
Любая задача имеет решение, даже когда решения не существует
Однажды довелось делать такую dll, столкнулся с одним интересным моментом.
Dll должна была включать или отключать определенное оборудование в зависимости от входящего в систему пользователя. Вызов функции SetupDiChangeState из dll завершался с кодом возврата 5 — отказано в доступе. Пытался включать привилегию SeLoadDriver — все бесполезно. И это несмотря на то, что опция Impersonate была 0, а сам Winlogon работает с привелегиями System.
В итоге пришлось из dll запускать отдельный процесс, который включает/выключает устройства, а в dll ждать его завершения.
Здравствуйте, Max404.NET, Вы писали:
MN>в журнале допущена досадная ошибка, указано "Требуется знание C#", а код на С (диска сейчас нет, проверить не могу).
Да, я видел... Но я не виноват... Этот текст я не добавлял. ... Вообще то требуется знание чистого С... >>И вообще опечаток хватает
Забыл упомянуть что для того чтобы код скомпилить надо поставить SDK ... MN>Я-то, понимаш, обрадовался, щас, расширю Логон для своих нужд... щас...
Да, управляемую dll winlogon по идее не сможет подгрузить .
Любая задача имеет решение, даже когда решения не существует
Здравствуйте, Max404.NET, Вы писали:
MN>Здравствуйте, Роман Бурда, Вы писали:
MN>в журнале допущена досадная ошибка, указано "Требуется знание C#", а код на С (диска сейчас нет, проверить не могу). И вообще опечаток хватает
MN>Я-то, понимаш, обрадовался, щас, расширю Логон для своих нужд... щас...
Какие проблемы создать регулярную dll-ку на C#? Или собрать dll-ку на C++/cli и перенаправлять из нее вызовы в сборку на C#?
Здравствуйте, ArtemGorikov, Вы писали:
AG>Здравствуйте, Max404.NET, Вы писали:
MN>>Здравствуйте, Роман Бурда, Вы писали:
MN>>в журнале допущена досадная ошибка, указано "Требуется знание C#", а код на С (диска сейчас нет, проверить не могу). И вообще опечаток хватает
MN>>Я-то, понимаш, обрадовался, щас, расширю Логон для своих нужд... щас...
AG>Какие проблемы создать регулярную dll-ку на C#? Или собрать dll-ку на C++/cli и перенаправлять из нее вызовы в сборку на C#?
Можно поподробнее?
ЗЫ. Вы внимательно прочитали по ссылке?
Одинаковые ошибки необязательно делать каждый раз, достаточно сделать одну, а затем обращаться к ней по мере необходимости из любого места программы.
РБ>Авторы: РБ> Роман Бурда
РБ>Аннотация: РБ>Рассматривается использование Winlogon notification package для обработки событий входа и выхода пользователей, включения и выключения операционной системы и некоторых других.
Роман, спасибо за пример к статье. Он мне помог избавиться от трояна, ставящегося как Winlogon notification package. При удалении его записи из реестра, троян восстанавливал ее снова. Я скачал ваш пример (самому было лень писать , поменял имена функций и с помощью MoveFileEx заменил после перезагрузки оригинальный package на ваш. После перезагрузки все стало нормально.
Спасибо еще раз.
В статье нет самого главного — как с этой написанной библиотекой общаться другим программам. От библиоекти, которая просто пишет что-то в лог толку нет никакого.
Я недавно закончил разрабатывать свою WLNP и набил несколько шишек. Для общения с библиотекой я решил использовать связку из Event, Mutex и MMF. И одной из шишек оказалось то, что WLNP вообще говоря загружается не в единственном экземпляре. А так как я думал, что это не так, то в библиотеке я всегда создавал MMF. В результате остальные загруженные экземпляры не моги этого сделать и клиент данной библиотеки получал не все сообщения о событиях.
Когда, наконец, меня осенило почему некоторые события не доходят до клиента, то я просто сделал так: сначала WLNP пробует создать MMF, если не получилось, то она пробует его открыть. И вуаля — все заработало.
Так же кто-то говорил, что ловится будет не все. Но я проверял, ловится и Fast User Switching, и удаленные подключения.
Ну и, наконец, в статье нет про события "Reconnect" и "Disconnect" (это как раз при Fast User Switching).
Здравствуйте, Роман Бурда, Вы писали:
> не используется ли Notify.dll другим процессом (если файл не удается переименовать – значит, кто-то его использует).
Переименовать можно и используемый файл. Удалить его нельзя и перенести на другой раздел (только скопировать).
Здравствуйте, IceStudent, Вы писали:
IS>Переименовать можно и используемый файл. Удалить его нельзя и перенести на другой раздел (только скопировать).
Когда у меня была выключена имперсонизация, переименовать файл не удавалось когда он использовался... Согласен, что я сказал не совсем однозначно, но не хотелось делать статью тяжелой в плане понимания, поэтому многое пришлось опустить. А совет для данного примера работает — сам проверял .
Любая задача имеет решение, даже когда решения не существует
SA>В статье нет самого главного — как с этой написанной библиотекой общаться другим программам.
В рамки данной статьи не вошли возможные способа передачи данных между процессами. Скажу одно, что полученные данные мне надо было передавать на сервер TCP и все получалось без проблем. В самом деле, уже столько написано по поводу передачи данных между процессами на RSDN что мне было просто стыдно добавлять это к статье.
SA>От библиоекти, которая просто пишет что-то в лог толку нет никакого.
Во первых, она простая, во вторых — ее очень легко можно использовать как основу для написания более серьезного проекта. С помощью библиотеки можно увидеть что пакет работает. Я поставил за цель научить пользоваться, а не рассмотреть все случаи жизни . Если вышесказанным пренебречь — тогда да, толку никакого.
SA>Я недавно закончил разрабатывать свою WLNP и набил несколько шишек. Для общения с библиотекой я решил использовать связку из Event, Mutex и MMF. И одной из шишек оказалось то, что WLNP вообще говоря загружается не в единственном экземпляре.
А вы включали имперсонификацию?
SA>Ну и, наконец, в статье нет про события "Reconnect" и "Disconnect" (это как раз при Fast User Switching).
Странно, еще раз посмотрел MSDN и не нашел этих событий... Где можно их почитать?
Любая задача имеет решение, даже когда решения не существует
Hello Burd, you wrote:
>> От библиоекти, которая просто пишет что-то в лог толку нет никакого. > Во первых, она простая, во вторых — ее очень легко можно использовать как основу для написания более серьезного проекта. С помощью библиотеки можно увидеть что пакет работает. Я поставил за цель научить пользоваться, а не рассмотреть все случаи жизни
В данном виде статья — просто напросто перевод на русский раздела МСДН по WLNP.
> А вы включали имперсонификацию?
Нет.
>> Ну и, наконец, в статье нет про события "Reconnect" и "Disconnect" (это как раз при Fast User Switching). > Странно, еще раз посмотрел MSDN и не нашел этих событий... Где можно их почитать?
Не знаю. В мсдн про них почему-то нет. Но данные события есть Делаются по аналогии с остальными.
Здравствуйте, Slava Antonov, Вы писали:
SA>В данном виде статья — просто напросто перевод на русский раздела МСДН по WLNP.
То есть если сделать пример более сложным, то статья перестанет быть переводом ???
Вообще то так и есть. В основной части это перевод МСДН. Ведь в конце концов WLNP документированная фича и ничего нового в ней не придумаешь.
Если Вы знаете что-то что в статье не отображено, опишите пожалуйста прямо здесь. Будет толк для всех, и для меня в том числе. А так это просто пустые разговоры.
Любая задача имеет решение, даже когда решения не существует
Hello Burd, you wrote:
> То есть если сделать пример более сложным, то статья перестанет быть переводом ???
Если пример сделать более сложным (читай более готовым к использованию), то это будет гораздо полезнее.
> Если Вы знаете что-то что в статье не отображено, опишите пожалуйста прямо здесь.
Про реконент, дисконет и множественную загрузку я уже сказал. Про stdcall тоже.
Hello Burd, you wrote:
> То есть если сделать пример более сложным, то статья перестанет быть переводом ???
И еще, мне непонятно для кого предназначена статья. Тем кто знает английский она не нужна. Те кто не знает английский, почти наверняка, не смогут прикрутить к данной реализации IPC.
Здравствуйте, Slava Antonov, Вы писали:
SA>И еще, мне непонятно для кого предназначена статья. Тем кто знает английский она не нужна. Те кто не знает английский, почти наверняка, не смогут прикрутить к данной реализации IPC.
между "знает" и "не знает" есть еще куча народа "могу, но ломает", так что если теперь мне придется вместо 10 страниц на англицком разбираться в 5 на русском и в 5 на аглицком — БОЛЬШОЕ спасибо переводчику этих 5 страниц.
Описанный метод весьма опсен,
Если вы не собираетесь заменять метод входа в систему а нужны только события то есть SENS API
см MSDN поиск ISensLogon
The ISensLogon interface inherits the methods of the standard COM interfaces:
IUnknown
IDispatch
In addition, ISensLogon defines the following methods.
Method Description
Logon A user has logged on.
Logoff A user has logged off.
StartShell Shell has been started.
DisplayLock Screen display has been locked.
DisplayUnlock Screen display has been unlocked.
StartScreenSaver Screen saver has been started.
StopScreenSaver Screen saver has been stopped.
ISensLogon2
In addition, ISensLogon2 defines the following methods.
Method Description
Logon A user has logged on.
Logoff A user has logged off.
SessionDisconnect A session has been disconnected.
SessionReconnect A session has been reconnected.
SessionPostShell A user has logged on and Windows Explorer (Shell) is up and running.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Роман Бурда
А>Описанный метод весьма опсен,
Согласен.
А>Если вы не собираетесь заменять метод входа в систему а нужны только события то есть SENS API А>см MSDN поиск ISensLogon
Это другой способ решения поставленной задачи. Работа с COM немного сложнее чем с Win32 API и требует больше времени для того чтобы разобраться. Согласен с тем что на COM все выглядит красивее, хотя для многих менее понятно и очевидно.
За замечания спасибо.
>>К сожалению это малополезная информация
Категорически не согласен. Если в Вашем компьютере заведется вирус, основанный на WLNP, Вы его не сможете найти не зная ничего о этой технологии. Это во первых. Во вторых очень важным преимуществом метода является его простота. В этом плане API всегда выигрывало перед COM. Но, как всегда, у каждого метода есть свои недостатки.
За замечания спасибо, заинтересованный пользователь сможет выбирать.
Любая задача имеет решение, даже когда решения не существует