Как я могу определить, является ли текущий процесс службой или нет (C ++, Win32)? - PullRequest
2 голосов
/ 07 января 2011

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

Iне может полагаться на какой-либо код, вызываемый из диспетчера управления службами, параметров запуска, остановки или командной строки.

В настоящее время я смотрю на GetConsoleWindow(), который, я надеюсь, вернет NULL для службы (без консоли) и дескриптор окна для любого приложения (с консолью).Не уверен, насколько верным является это предположение.

Есть идеи для лучшего решения?

Ответы [ 4 ]

7 голосов
/ 07 января 2011

Поиск текущего идентификатора процесса (GetCurrentProcessId) из списка всех запущенных служб (EnumServicesStatusEx)?

1 голос
/ 10 января 2011

Используйте WMI для запроса Win32_Service экземпляров, где ProcessId = MyProcessid. Если совпадений нет, то ваш процесс не является службой.

Справочная информация о создании приложения WMI в C ++ здесь .

1 голос
/ 07 января 2011

Предположение GetConsoleWindow () недопустимо.

Мне кажется, что вам важнее контекст вашего процесса. Вы спрашиваете, если ваша программа работает в контексте службы или пользовательского сеанса? Если это так, используйте ProcessIdToSessionId () http://msdn.microsoft.com/en-us/library/aa382990%28v=VS.85%29.aspx, чтобы получить идентификатор сеанса, и вы узнаете его.

0 голосов
/ 07 января 2011

Используйте OpenProcessToken для получения токена текущего процесса. Затем используйте CheckTokenMembership, чтобы проверить, включает ли токен известный SID WinServiceSid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...