Проверьте, установлены ли службы с помощью C - PullRequest
1 голос
/ 26 марта 2012

Я пишу приложение на C, которое создает службу Windows. Я хотел бы проверить, установлена ​​ли служба, прежде чем пытаться вызвать функцию установки, но мне не удается найти способ проверить это.

Я написал код выше, чтобы попробовать:

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.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 26 марта 2012

Можно было бы всегда пытаться 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());
}
2 голосов
/ 13 августа 2018

Если вам нужен ответ «да / нет», установлена ​​ли служба или обратите внимание, используйте следующую функцию:

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;

}
0 голосов
/ 26 марта 2012

Попробуйте использовать QueryServiceStatusEx

См. Пример здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...