Winapi 检查EXE以确定它是用户可执行文件还是系统服务

Winapi 检查EXE以确定它是用户可执行文件还是系统服务,winapi,service,Winapi,Service,是否有方法检查EXE文件(PE头等)以确定该文件是系统服务还是用户可执行文件 我有一个包含多个系统服务模块的应用程序套件,随着我们支持更多设备,将来可能会添加更多。我希望能够查看文件夹中的所有EXE,确定哪些是服务,并获取它们的运行状态和版本信息以显示给用户,而不必提前“知道”特定的文件名。这是不可能的。构建可以作为服务或标准进程运行的可执行文件是完全可能的,甚至是常见的 如果您可以控制创建所有可执行文件,那么您可以自己标记它们,例如使用自定义资源,以指示文件的预期用途 枚举服务列表(或注册表[

是否有方法检查EXE文件(PE头等)以确定该文件是系统服务还是用户可执行文件


我有一个包含多个系统服务模块的应用程序套件,随着我们支持更多设备,将来可能会添加更多。我希望能够查看文件夹中的所有EXE,确定哪些是服务,并获取它们的运行状态和版本信息以显示给用户,而不必提前“知道”特定的文件名。

这是不可能的。构建可以作为服务或标准进程运行的可执行文件是完全可能的,甚至是常见的


如果您可以控制创建所有可执行文件,那么您可以自己标记它们,例如使用自定义资源,以指示文件的预期用途

枚举服务列表(或注册表[HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\services]),并检查其EXE路径是否与您感兴趣的文件夹中的任何文件匹配。

有一种启发式方法,在大多数情况下都有效,尽管可能在任何方面都失败

如果二进制文件导入了
StartServiceCtrlDispatcherA
StartServiceCtrlDispatcherW
,则它很可能作为服务工作,如果不是,则不太可能


对于此API,不太可能延迟导入或
GetProcAddress
。最合理的警告是服务二进制可以依赖另一个二进制调用
StartServiceCtrlDispatcher
。作为一种特殊情况,它可以基于
svchost

服务,如“Windows服务”中的服务?如果是这样的话,那么你可以在注册表中查看为什么ex实际上注册为服务Hi SteveS,你可以查看@Olaf的答案,看看它是否有帮助。参考。registry方法是我所想的,但我很好奇是否有一种方法可以通过查看EXE本身来实现这一点——出于Dave在下面提到的原因,我不确定这种方法是否可用,但如果是的话,它会简化一些事情。谢谢,我也这么怀疑。我控制着所有的EXE,但是scan registry and compare方法可以做我需要的事情,而不需要修改和重新分发EXE,否则这些EXE在很多站点都可以正常工作。谢谢