Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Можно ли узнать кто прячется за ServiceHost?

#c_sharp #net #windows #процесс


При работе с пакетом офиса через Microsoft.Office.Interop в процессах создается офисные
приложения.

Например, работая с Word создастся процесс Word'a, а сам интерфейс будет невидимым.

Так вот, можно ли понять, что этот Word связан с моей программой, а не сам пользователь
его запустил, пока программа выполняется?

Пробовал родительский PID получать, так вот он относится к ServiceHost=> я не могу
сравнить его с PID своей программы, что бы удостоверится, что я породил данный процесс.
    


Ответы

Ответ 1



Проще всего - выбрать сервисы через WMI (System.Management.dll) и отфильтровать по процессу, примерно так: using System.Diagnostics; using System.Management; ManagementObjectSearcher windowsServicesSearcher = new ManagementObjectSearcher("root\\cimv2", "select * from Win32_Service"); ManagementObjectCollection objectCollection = windowsServicesSearcher.Get(); var services = objectCollection .Cast() .Select(mo => new { Name = mo.Properties["Name"].Value.ToString(), ProcessID = mo.Properties["ProcessId"].Value.ToString() }) .Where(s => s.ProcessID != "0") .ToList(); services .GroupBy(s => Int32.Parse(s.ProcessID), g => g.Name) .Where(g => Process.GetProcessById(g.Key).ProcessName.Contains("svchost")) .ToList() .ForEach(g => Console.WriteLine($"{g.Key}: \t {String.Join(",", g)}")); Способ сделать то же самое без кода и без сторонних утилит: В Task Manager в контекстном меню на списке процессов выбрать Go to service(s). Task Manager переключится на список сервисов, все сервисы внутри процесса будут выделены в списке:

Ответ 2



Зная PID, можно получить список окон данного процесса. Зная handle окна, ему можно отправлять сообщения, а значит узнать его класс, заголовок, все атрибуты, список дочерних окон и.т.д. (в примере как раз идет получение заголовка). В общем, с чужим окном через handle можно делать практически все то, что и с собственным. У интерактивных программ с GUI, очевидно, окон будет очень много. Как минимум одно из них является главным окном приложения, его можно идентифицировать по заголовку, атрибутам и набору дочерних окон. У процессов, подключенных к ServiceHost, окон, скорее всего, не будет вообще. Или будут какие-то служебные окна, но все они будут скрытые (проверяется это просто) и их набор будет довольно постоянным, так как пользователь не взаимодействует с GUI.

Комментариев нет:

Отправить комментарий