2011-01-07 2 views
2

나는이 비슷한 주제에 대해 적절한 해결책이없는 비슷한 질문을 모두 읽었다.현재 프로세스가 서비스인지 여부를 어떻게 알 수 있습니까 (C++, Win32)?

내가 알고 싶은 것은 내 코드가 실행중인 응용 프로그램인지 서비스인지 응용 프로그램인지 여부를 어떻게 알 수 있습니까? 왜 이것을 알고 싶습니다 - 대상 응용 프로그램에 주입되는 코드를 작성하고 있으며이 코드는이 정보를 알 수있는 방법이 없기 때문에 코드 자체를 해결해야합니다.

서비스 제어 관리자, 시작, 중지 또는 명령 줄 매개 변수에서 호출되는 코드에 의존 할 수 없습니다.

현재 서비스 (콘솔 없음)에 대한 NULL과 콘솔 (응용 프로그램)에 대한 창 핸들을 반환하는 GetConsoleWindow()를보고 있습니다. 이 가정이 얼마나 유효한지 잘 모르겠습니다.

더 나은 솔루션을위한 아이디어가 있습니까?

감사

스티븐

+1

코드에서 알아야하는 이유는 무엇입니까? 아마도 그 것을 분명히 감지 할 수있을 것입니다. 예를 들어, 사용자의 대화 형 데스크톱 (또는 터미널 서버의 데스크톱)에만 영향을 주거나 SYSTEM 계정 (또는 다른 서비스 계정) 내에서 실행하지 않으려는 경우 해당 항목을 검색 할 수 있습니다. –

+1

서비스를 정의하는 방법 (OS가 염려하는 한 APP는 단지 APP 임). 서비스를 정의하는 방법은 우리가 그것을 탐지 할 수있는 방법을 나타낼 것입니다. –

+0

서비스가 "services.msc"제어판에 나열된 것 같아요.;) – jalf

답변

7

실행중인 모든 서비스 (EnumServicesStatusEx)의 목록에서 현재 프로세스 ID (GetCurrentProcessId를) 검색?

+0

EnumServiceStatus (Ex)에 대해 몰랐습니다. 감사합니다. 올바른 접근 방식처럼 보입니다. –

+0

모든 응용 프로그램에 해당 권한이 있습니까? – Yetti99

1

GetConsoleWindow() 가정은 유효하지 않습니다.

나는 당신이 당신의 과정의 맥락에 더 관심이 있다고 생각한다. 프로그램이 서비스 컨텍스트 또는 사용자 세션에서 실행 중인지 묻는 중입니까? 그렇다면 ProcessIdToSessionId() http://msdn.microsoft.com/en-us/library/aa382990%28v=VS.85%29.aspx을 사용하여 세션 ID를 얻으면 알 수 있습니다.

0

OpenProcessToken을 사용하여 현재 프로세스 토큰을 가져옵니다. 그런 다음 CheckTokenMembership을 사용하여 토큰에 WinServiceSid 잘 알려진 SID가 포함되어 있는지 확인하십시오.

+2

모든 서비스 프로세스에 해당 SID가있는 것은 아닙니다! – Anders

1

Win32_Service 인스턴스 'ProcessId = MyProcessid'를 쿼리하려면 WMI를 사용하십시오. 일치하는 항목이 없으면 프로세스가 서비스가 아닙니다.

C++에서 WMI 응용 프로그램을 만들 때의 배경 here.

관련 문제