Не каждый сервисный процесс имеет такой SID!

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

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

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

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

 Leo Davidson07 янв. 2011 г., 13:20
Какова причина, по которой ваш код должен сказать? Вы, вероятно, сможете обнаружить эту вещь явно. Например, если вы хотите повлиять только на интерактивный рабочий стол пользователя (или рабочие столы на сервере терминалов) или если вы не хотите запускаться с учетной записью SYSTEM (или другой учетной записью службы), вы можете обнаружить эти вещи ...
 Stephen Kellett05 февр. 2011 г., 17:27
Причина, по которой я хочу знать, является ли это службой, заключается в том, что с точки зрения инструментов, которые я пишу (которые могут в конечном итоге выполняться внутри службы или приложения), есть разница. Часто служба будет работать с ограниченной учетной записью (IIS), плюс проблемы с запуском / отключением для служб различаются по сравнению с приложениями.
 jalf07 янв. 2011 г., 14:26
Я полагаю, что услуга "все, что перечислено вservices.msc панель управления. ;)
 Martin York07 янв. 2011 г., 13:43
Как вы определяете услугу (для операционной системы приложение - это просто приложение). То, как вы определяете услугу, покажет, как мы можем ее обнаружить.
 Stephen Kellett05 февр. 2011 г., 17:29
Мартин, сервис - это не то же самое, что приложение. Вам нужно только написать один, чтобы знать, что они очень разные звери. Да, вы обычно можете написать сервис, который может работать как приложение, но это не то, чем я занимаюсь. Мой код может в конечном итоге выполняться внутри службы или внутри приложения, и мне нужно знать, какой из них выбрать несколько иной вариант для случая, когда это служба.

Ответы на вопрос(4)

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

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

Решение Вопроса

GetCurrentProcessId) из списка всех запущенных сервисов (EnumServicesStatusEx)?

 Yetti9904 июл. 2017 г., 21:06
Будет ли у каждого приложения разрешение на это?
 Stephen Kellett05 февр. 2011 г., 17:31
Я не знал о EnumServiceStatus (Ex). Благодарю. Похоже, только правильный подход.

атем используйте CheckTokenMembership, чтобы проверить, включает ли токен известный SID WinServiceSid.

 Anders07 янв. 2011 г., 22:29
Не каждый сервисный процесс имеет такой SID!

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

Ваш ответ на вопрос