我有一個應用程序,在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調試器中打開...
但它不利用。直到我重新啓動系統時,服務纔會被卸載(刪除鏈接到服務的註冊表也不起作用)。
我檢查了傳遞給這些函數的參數,它們看起來是正確的。
還有什麼我應該檢查,以確保安裝正確,或成功卸載?
什麼讓你覺得你需要殺死mmc實例?對最終用戶來說這是一件非常可怕的事情! –
請提供更多信息。你如何嘗試啓動服務,以及* exact *錯誤消息是什麼?你確定'szDirectory'包含服務可執行文件的* full *路徑,而不是(如變量名稱所示),只是服務可執行文件所在目錄的路徑?卸載時,調用QueryServiceStatusEx的結果是什麼? –
另外,TraceAdvice()是做什麼的? –