如何检查我的可执行文件是为服务运行还是为普通程序运行?

问题描述 投票:0回答:4

我正在使用

mingw
开发一个双赢服务,我已经尝试了几个小时了 我在互联网上查找了我使用的示例
ChatGPT
它返回的任何内容都不起作用,我发现了几个例子 与我想要的无关

我希望有某种方法可以做到这一点 想法,在创建

SERVICE_TABLE_ENTRY
之前,我可以检查我的可执行文件是否已启动 对于 Windows 服务, 如果是的话我创建
SERVICE_TABLE_ENTRY
如果我不做任何其他事情的话。

c windows windows-services mingw
4个回答
0
投票

如果您的程序支持多种模式,那么我建议使用像

/service
这样的命令行参数来进行服务注册。

或者,您可以检查您的进程令牌是否包含

S-1-5-6
(SECURITY_SERVICE_RID),但我不确定引入的是哪个 Windows 版本。


0
投票

如果您想检查它是否正在运行,您应该检查该服务是否正在运行。通过运行

services.msc
并查找您注册的服务来检查服务。

前段时间我写了一个简单的库来使你的程序成为服务(在 Windows 上)或守护进程(在 *nix 上): https://sourceforge.net/projects/daemonservice/

也许你可以检查源代码,了解它是如何完成的......


0
投票

我看到了一种简单的方法来检查它,只需创建

SERVICE_TABLE_ENTRY
并使用
StartServiceCtrlDispatcher
如果它返回错误,则可能可执行文件像普通程序一样启动。

SERVICE_TABLE_ENTRY _dispatcher_entry_table[] = 
{

    {"", (LPSERVICE_MAIN_FUNCTION)serviceMain},

    {NULL, NULL}

};

if (!StartServiceCtrlDispatcher(_dispatcher_entry_table))
{

    DWORD __error_code = GetLastError();

    if (__error_code == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
    {

         //It's probably a normal program

    }
    else
    {

         //handle the errors

    }

}

0
投票

有点晚了,但这对我来说可以区分 service.exe 或 cmd.exe 的调用:

   static bool AreWeAService()
    {  BOOL  bIsAService = false;
       BYTE  sidService[SECURITY_MAX_SID_SIZE] = { 0 };
       DWORD cbSidSize = SECURITY_MAX_SID_SIZE;
    
       /* Create a SID for the Windows Service Group (S‒1‒5‒6) and check it against ours */
       if (TRUE == ::CreateWellKnownSid(WinServiceSid, nullptr, &sidService, &cbSidSize))
          ::CheckTokenMembership(NULL, &sidService, &bIsAService);
    
       return bIsAService;
    }

将 SID 块分配为 SECURITY_MAX_SID_SIZE 非常重要,否则 CheckTokenMembership API 调用将失败并出现“无效参数”错误。

© www.soinside.com 2019 - 2024. All rights reserved.