@AnotherAnkor

Отследить событие входа в систему windows из c#?

Привет всем!
Пишу код, который будет висеть как служба в системе и следить за авторизацией пользователя. Если пользователь вошёл в систему и пользователь не админ, то будет запускать определённую программу и следить, чтобы она работала.
Так вот вопрос: как отследить момент входа в систему?
З. ы. Я и есть админ. И моей программе нужны права не ниже админских (на ходу редактирует реестр). Поэтому я и решил написать программу, которая будет висеть как сервис и запускать моё приложение с нужными правами, когда это надо.
  • Вопрос задан
  • 3927 просмотров
Пригласить эксперта
Ответы на вопрос 3
mindtester
@mindtester Куратор тега Windows
http://iczin.su/hexagram_48
можно еще прописать нужную программу как winlogon script в политиках, это будет действовать на всех пользователей, в т.ч. на новых

Выполнить->gpedit.msc -> Local Computer Policy -> User Configuration -> Windows Settings -> Scripts (Logon/Logoff)

если нужно что бы не было засветки на экране, надо делать не консольное приложение (и тем более не батник) а к примеру winform приложение, но без главного окна или стартующее с окном в состоянии "скрытое"

из приложения можете дергать сервис, а можно сразу делать то что планировали без всяких сервисов

ps - как вариант можно с каким то интервалом времени читать журнал безопасности и парсить события входа в систему

надо понимать что в любом случае скрыться от админа практически невозможно

к примеру тулза AutoRuns покажет "инородное тело" в системе при любом способе авто запуска - меню "автозапуск", реестр - любые ветки, сервис, драйвер, шедулер, политика... хотя вот сейчас посмотрел и с ходу не увидел... проверил - забавно, как раз политику похоже AutoRuns и не показывает...

pps - ну не факт что для этого надо изобретать целый сервис

тогда можно изначально запустить нужную программу как сервис

к примеру есть библиотека для запуска для запуска отлаженой консольной программы c# как сервиса - https://github.com/Topshelf/Topshelf

ppps - не совсем понятно зачем строить сервис - целевое приложение не может работать в бэкграунде? (его сразу можно было бы запускать как сервис, способов много, в т.ч. для готовых приложений.. в большинстве случаев по крайней мере...)

или приложение требует интерактива с пользователем?

можно просто создать батник в автозагрузке, для запуска всегда от имени конкретного логина - runas к Вашим услугам

к примеру можно запустить экземпляр IE от имени другой учетки, и иметь в нем кеш и куки другой учетки.. вплоть до одновременного логина в социалку под разными именами... под одним из текущего профиля.. под другим из профиля IE запущенного от имени другой виндовой учетки

(я просто пытаюсь понять круг проблем, на основе опыта решения ситуаций, которые возможно похожи...

pppps - ... возможно надо уточнить - если приложение ВАШЕ (в исходниках) - ну в конце концов - сделайте само приложение сервисом и запускайте от имени системы (к примеру)... если оно интерактивное.. - да тоже самое - любой удобный способ автозапуска, но от имени нужной учетки... кстати, в том числе от имени системы тоже
Ответ написан
Комментировать
@mayorovp
Вам надо перегрузить вот этот метод:
ServiceBase.OnSessionChange
Ответ написан
Комментировать
gbg
@gbg Куратор тега Windows
Любые ответы на любые вопросы
Переделать всю архитектуру и сменить .NET на C++ для системного сервиса. Это в идеале.

А так, ищите по тексту "winlogon hook".. Это если делать серьезно, надежно и так далее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы