2016-10-11 102 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); 
} 

}

我確信所有的點,即。

  • 任務管理器中關閉
  • 服務控制檯被關閉。
  • MMC的所有實例都已關閉。
  • 服務已停止
  • 服務是不是在Visual Studio調試器中打開...

但它不利用。直到我重新啓動系統時,服務纔會被卸載(刪除鏈接到服務的註冊表也不起作用)。

我檢查了傳遞給這些函數的參數,它們看起來是正確的。

還有什麼我應該檢查,以確保安裝正確,或成功卸載?

+0

什麼讓你覺得你需要殺死mmc實例?對最終用戶來說這是一件非常可怕的事情! –

+0

請提供更多信息。你如何嘗試啓動服務,以及* exact *錯誤消息是什麼?你確定'szDirectory'包含服務可執行文件的* full *路徑,而不是(如變量名稱所示),只是服務可執行文件所在目錄的路徑?卸載時,調用QueryServiceStatusEx的結果是什麼? –

+0

另外,TraceAdvice()是做什麼的? –

回答

1

您需要先停止服務,否則它會陷入這種掛起的刪除狀態。強行殺死該服務與停止服務不是一回事。從相同面積的documentation,您需要ControlService(SERVICE_CONTROL_STOP)