【问题标题】:Check if a services is installed using C检查是否使用 C 安装了服务
【发布时间】:2012-04-09 18:23:38
【问题描述】:

我正在编写一个创建 Windows 服务的 C 应用程序。我想在尝试调用安装函数之前检查该服务是否已安装,但我无法找到如何检查它。

我已经写了上面的代码来试试:

DWORD InstallMyService()
{
    char strDir[1024 + 1];
    SC_HANDLE schSCManager;
    SC_HANDLE schService;
    LPCTSTR lpszBinaryPathName;

    if (GetCurrentDirectory(1024, strDir) == 0)
    {
        aff_error("GetCurrentDirectory");
        return FALSE;
    }
    strcat(strDir, "\\"MY_SERVICE_BIN_NAME);
    if ((schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL)
    {
        printf("Error OpenSCManager : %d\n", GetLastError());
        return FALSE;
    }
    lpszBinaryPathName = strDir;
    schService = CreateService(schSCManager, MY_SERVICE_NAME, MY_SERVICE_DESCRIPTOR,
                             SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
                             lpszBinaryPathName, NULL, NULL, NULL, NULL, NULL);
    if (schService == NULL)
    {
        printf("Error CreateService : %d\n", GetLastError());
        return FALSE;
    }
    CloseServiceHandle(schService);
    return TRUE;
}

但此代码不会检测服务是否仍然存在。有人知道要调用哪个函数吗?我发现很多帖子都在讨论这个问题,但不是在 C 中,而是在 C# 或 VB 中。

谢谢。

【问题讨论】:

  • 出了什么问题?是OpenSCManager 电话还是GetServiceKeyName 电话?
  • 看来,只有当服务仍然被创建时,OpenSCManager 才会失败。
  • 您自己安装软件吗?为什么不创建一个注册表项来告诉您它是否已安装?我不认为您可以查询已安装的专门。您可以尝试使用OpenService 打开服务,如果失败,则表明该服务未安装,但也可能意味着它未正确配置。

标签: c visual-studio-2010 winapi service


【解决方案1】:

一种可能性是总是尝试CreateService(),如果失败则查询GetLastError()并检查它是否等于ERROR_SERVICE_EXISTS

SC_HANDLE service_handle = CreateService(...);
if (0 == service_handle)
{
    if (ERROR_SERVICE_EXISTS == GetLastError())
    {
        /* Handle service already exists. */
    }
    else
    {
        /* Handle failure. */
    }
}

这需要将您的代码从具有两个函数 InstallService()CheckService() 稍微更改为具有一个函数(例如)EnsureServiceInstalled()

或者,您可以使用OpenService() 函数,该函数将失败,GetLastError() 代码为ERROR_SERVICE_DOES_NOT_EXIST

SC_HANDLE scm_handle = OpenSCManager(0, 0, GENERIC_READ);

if (scm_handle)
{
    SC_HANDLE service_handle = OpenService(scm_handle,
                                           "the-name-of-your-service",
                                           GENERIC_READ);
    if (!service_handle)
    {
        if (ERROR_SERVICE_DOES_NOT_EXIST != GetLastError())
        {
            fprintf(stderr,
                    "Failed to OpenService(): %d\n",
                    GetLastError());
        }
        else
        {
            /* Service does not exist. */
            fprintf(stderr, "Service does not exist.\n");
        }
    }
    else
    {
        fprintf(stderr, "Opened service.\n");
        CloseServiceHandle(service_handle);
    }

    CloseServiceHandle(scm_handle);
}
else
{
    fprintf(stderr,
            "Failed to OpenSCManager(): %d\n",
            GetLastError());
}

【讨论】:

  • 我试过只有一个功能,但至于OpenSCManager调用失败,我不知道ERROR_SERVICE_EXISTS是否还能适用?
  • 不,OpenSCManager() 函数与特定服务无关。 OpenSCManager() 失败后能否获取GetLastError() 值。这将表明问题所在。
  • 嗯,这很奇怪,现在调用 OpenSCManager 是可以的,但现在是 CreateService 抛出 1073 错误。我将更新我的帖子,向您展示 CreateService 调用。
  • 这就解释了!我读到这是别的东西:)谢谢
  • 没问题。这是指向Windows System Error Codes 的链接,您可能会发现它对您有所帮助。
【解决方案2】:

如果您需要一个是/否回答是否安装了服务或注意,请使用以下功能:

bool IsServiceInstalled(LPWSTR ServiceName)
{
    bool serviceInstalled = false;
    SC_HANDLE scm_handle = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
    if (scm_handle)
    {
        SC_HANDLE service_handle = OpenService(scm_handle, ServiceName, SERVICE_INTERROGATE);
        if (service_handle != NULL)
        {
            wprintf(L"Service  Installed\n");
            serviceInstalled = true;
            CloseServiceHandle(service_handle);
        }
        else
        {
            wprintf(_T("OpenService failed - service not installed\n"));
        }
        CloseServiceHandle(scm_handle);
    }
    else
        wprintf(_T("OpenService couldn't open - service not installed\n"));

    return serviceInstalled;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-01
    • 2021-03-19
    • 2020-10-18
    • 2015-12-24
    • 2013-09-26
    • 2013-12-06
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多