Frank R. Haugen Ответов: 1

Определите, был ли процесс открыт пользователем или другим процессом с помощью C#?


У меня есть служба, работающая на некоторых компьютерах, которые отчитываются перед сервером. Служба проводит аудит всех запущенных процессов, а затем проверяет, есть ли они в черном списке или нет. Если процесс занесен в черный список, служба собирает имя, имя пользователя, имя машины, время запуска и время выполнения, а затем отправляет его на сервер. Это прекрасно работает.

Что я также хотел бы, так это посмотреть, работает ли процесс другим приложением, а не пользователем. например, Cinema4D (приложение для 3D-моделирования) запускает его рендерер. Это не то же самое, как если бы пользователь открывал исполняемый файл напрямую.

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

Любая помощь приветствуется!

Что я уже пробовал:

Я погуглил его, но не получил никаких релевантных ответов

1 Ответов

Рейтинг:
12

Jochen Arndt

Если у вас уже есть информация о процессе, вы должны иметь возможность получить PID родительского процесса (например, с помощью WMI) и использовать его для получения обычной информации о процессе.

Я не совсем уверен, но процессы, запущенные пользователем, должны иметь explorer.exe как родитель (экземпляр проводника для рабочего стола).

[РЕДАКТИРОВАТЬ]
Думая об этом могут быть и другие родители:


  • Еще один экземпляр Explorer, когда он запускается изнутри.
  • Один cmd.exe экземпляр при запуске из командной строки.

Но с ними можно справиться, следуя цепочке родительских процессов. Для процесса, запущенного пользователем, это должен быть, наконец, экземпляр проводника рабочего стола.

Однако, по крайней мере, каждый "нормальный" процесс запускается таким образом. Поэтому, возможно, придется использовать какие-то белые и/или черные списки.
[/РЕДАКТИРОВАТЬ]


Frank R. Haugen

Это звучит логично, я проверю

Kornfeld Eliyahu Peter

Позаботься об этом:
1. список процессов может содержать уже завершенный процесс, и запрос родительского процесса для них даст исключение
2. Вы можете быть одурачены цепями... Например, если у вас есть приложение панели инструментов, например RocketDock, родительский процесс приложений, запущенных с панели инструментов, не будет explorer.exe но Ракетдок был исполняемым... Родителем его будет исследователь...
3. также для приложений, запущенных при запуске системы (меню Пуск или реестр), родителем будет explorer.exe (на самом деле все в контексте вошедшего в систему пользователя будет родительским explorer.exe)

Jochen Arndt

Пункты 2 и 3 были обработаны тем временем в моем обновленном ответе.

Но пункт 1 может быть еще более серьезным, потому что PID повторно используются, так что информация для неправильного процесса может быть извлечена (в то время как перехват исполнений не должен быть проблемой).