2016-10-11 1 views
0

У меня есть приложение, в C++, которое пытается, при запуске (в этот момент никакой другой соответствующий процесс не считается запущенным), установить пару сервисов.Установка/удаление Windows-сервисов в Windows 10

Рабочий процесс заключается в том, что если службы существуют, то они удаляются, иначе они будут удалены, а затем повторно установлены.

Я последовал за несколько учебных пособий, таких как: Installing a service

К сожалению, что-то, кажется, идет не так с установкой или удаления.

При условии, что служба не установлена, когда я приступаю к установке сервисов, они устанавливаются, а затем я пытаюсь изменить конфигурацию на задержку-автозапуск.

На этом этапе, хотя службы установлены, я не могу запустить их, так как я получаю сообщение об ошибке, что службы не могут быть найдены.

Когда я пытаюсь удалить службы, деинсталляция завершилась неудачно, указав ошибку 1060, указав, что службы отмечены для удаления.

SC_HANDLE schSCManager; 
SC_HANDLE schService; 

schSCManager = OpenSCManager(
    NULL,     // local computer 
    NULL,     // ServicesActive database 
    SC_MANAGER_ALL_ACCESS); // full access rights 

if (schSCManager == nullptr) 
{ 
    continue; 
} 
if (bInstall) 
{ 
    schService = CreateService(
     schSCManager,    // SCM database 
     szServiceName,     // name of service 
     szDisplayName,     // service name to display 
     SERVICE_ALL_ACCESS,  // desired access 
     SERVICE_WIN32_OWN_PROCESS, // service type 
     SERVICE_DEMAND_START,  // start type 
     SERVICE_ERROR_NORMAL,  // error control type 
     szDirectory,     // path to service's binary 
     NULL,      // no load ordering group 
     NULL,      // no tag identifier 
     NULL,      // no dependencies 
     NULL,      // LocalSystem account 
     NULL);      // no password 

    if (schService == NULL) 
    { 
     TraceAdvice(L"CreateService failed (%d)\n", GetLastError()); 

     CloseServiceHandle(schSCManager); 
     continue; 
    } 
    else 
    { 
     if (!ChangeServiceConfig(
      schService,   // handle of service 
      SERVICE_NO_CHANGE,  // service type: no change 
      SERVICE_CONFIG_DELAYED_AUTO_START_INFO, // service start type 
      SERVICE_NO_CHANGE,  // error control: no change 
      NULL,     // binary path: no change 
      NULL,     // load order group: no change 
      NULL,     // tag ID: no change 
      NULL,     // dependencies: no change 
      NULL,     // account name: no change 
      NULL,     // password: no change 
      NULL))    // display name: no change 
     { 
      TraceAdvice(L"ChangeServiceConfig failed (%d)\n", GetLastError()); 
     } 
     TraceAdvice(L"Service installed successfully\n"); 
    } 

    CloseServiceHandle(schService); 
    CloseServiceHandle(schSCManager); 
    /*TraceFatal(_T("Now installing : %s"), szServiceName); 
    _stprintf_s(szTmp, _T("SC create %s binpath= \"%s%s.exe\" displayName= \"%s\" start= delayed-auto"), szServiceName, szDirectory, szServiceName, szDisplayName); 
    TraceFatal(_T("Command is : %s"), szTmp);*/ 
} 
else 
{ 

    _wsystem(_T("taskkill /F /IM mmc.exe")); // Need to kill any instance of MMC running 
    _wsystem(_T("taskkill /F /IM procexp.exe")); 

    schService = OpenService(
     schSCManager,  // SCM database 
     szServiceName,   // name of service 
     DELETE);   // need delete access 

    if (schService == NULL) 
    { 
     TraceAdvice(L"OpenService failed (%d)\n", GetLastError()); 
     CloseServiceHandle(schSCManager); 
     continue; 
    } 

    DWORD dwBytesNeeded; 
    SERVICE_STATUS_PROCESS ssp; 

    if (!QueryServiceStatusEx(
     schService, 
     SC_STATUS_PROCESS_INFO, 
     (LPBYTE)&ssp, 
     sizeof(SERVICE_STATUS_PROCESS), 
     &dwBytesNeeded)) 
    { 
     printf("QueryServiceStatusEx failed (%d)\n", GetLastError()); 
    } 
    if (ssp.dwCurrentState == SERVICE_RUNNING) 
    { 
     _stprintf_s(szTmp, _T("taskkill /F /IM %s.exe"), szServiceName); 
     _wsystem(szTmp); 
    } 
    // Delete the service. 

    if (!DeleteService(schService)) 
    { 
     TraceAdvice(L"DeleteService failed (%d)\n", GetLastError()); 
    } 
    else TraceAdvice(L"Service deleted successfully\n"); 

    CloseServiceHandle(schService); 
    CloseServiceHandle(schSCManager); 
} 

}

Я удостоверился из всех точек, а именно.

  • Диспетчер задач был закрыт
  • Консоль Service была закрыта.
  • Все экземпляры MMC были закрыты.
  • служба была остановлена ​​
  • служба не была открыта в отладчик в Visual Studio ...

Но не воспользоваться. Служба не удаляется, пока я не перезагружу систему (удаление реестра, связанного с сервисом, также не работает).

Я проверил параметры, которые я передаю этим функциям, и они кажутся правильными.

Что еще я должен проверять, чтобы обеспечить правильную установку или удачную деинсталляцию?

+0

Что заставляет вас думать, что вам нужно убить экземпляры mmc? Это довольно ужасная вещь для конечного пользователя! –

+0

Дополнительная информация, пожалуйста. Как вы пытаетесь запустить службу, и что такое * точное сообщение об ошибке? Вы уверены, что 'szDirectory' содержит * полный * путь к исполняемому файлу службы, а не (как подсказывает имя переменной) только путь к каталогу, в котором находится исполняемый файл службы? При удалении, что является результатом вызова QueryServiceStatusEx? –

+0

Также, что делает TraceAdvice()? –

ответ

1

Сначала вам нужно остановить службу, иначе она застрянет в этом состоянии ожидания. Принудительное убийство службы - это не то же самое, что останавливать ее. Из той же области documentation вам нужно ControlService(SERVICE_CONTROL_STOP).

 Смежные вопросы

  • Нет связанных вопросов^_^