如何判断当前进程是否为服务(C ++,Win32)?

时间:2011-01-07 12:02:16

标签: c++ winapi

如何判断应用程序运行的代码是在服务还是应用程序中?为什么我想知道这一点 - 我正在编写一些注入目标应用程序的代码,而且代码无法预先知道这些信息,因此必须自行解决。

我不能依赖从服务控制管理器调用的任何代码,启动,停止或命令行参数。

我目前正在查看GetConsoleWindow()我希望将返回NULL服务(无控制台)和任何应用程序的窗口句柄(具有控制台)。不确定这个假设是否有效。

任何有关更好解决方案的想法?

4 个答案:

答案 0 :(得分:7)

从所有正在运行的服务列表(GetCurrentProcessId)中搜索当前进程ID(EnumServicesStatusEx)?

答案 1 :(得分:1)

GetConsoleWindow()的假设无效。

在我看来,您更关心流程的背景。如果您的程序在服务上下文或用户会话中运行,您是否在询问?如果是这样,请使用ProcessIdToSessionId()http://msdn.microsoft.com/en-us/library/aa382990%28v=VS.85%29.aspx来获取会话ID,您将会知道它。

答案 2 :(得分:1)

使用WMI查询“ProcessId = MyProcessid”的Win32_Service个实例。如果没有匹配,那么您的流程不是服务。

使用C ++ here创建WMI应用程序的背景知识。

答案 3 :(得分:0)

使用OpenProcessToken获取当前进程令牌。然后使用CheckTokenMembership查看令牌是否包含WinServiceSid众所周知的SID。