Saya memiliki aplikasi, di C++
, yang mencoba, saat dijalankan (pada saat itu, diperkirakan tidak ada proses relevan lainnya yang sedang berjalan), untuk menginstal beberapa layanan.
Alur kerjanya adalah jika layanan tersebut ada, maka layanan tersebut akan dihapus instalasinya, jika tidak, layanan tersebut akan dihapus instalasinya dan kemudian diinstal ulang.
Saya telah mengikuti beberapa tutorial seperti: Menginstal layanan
Sayangnya, sepertinya ada yang salah dengan instalasi atau uninstall.
Dengan asumsi bahwa layanan tidak diinstal, ketika saya melanjutkan untuk menginstal layanan, layanan tersebut diinstal, dan saya kemudian mencoba mengubah konfigurasi, menjadi tertunda-Mulai otomatis.
Pada tahap ini, meskipun layanan telah diinstal, saya tidak dapat memulainya, karena saya mendapatkan pesan kesalahan yang mengatakan layanan tidak dapat ditemukan.
Ketika saya mencoba mencopot pemasangan layanan, pencopotan pemasangan gagal, memberikan kesalahan 1060, mengatakan layanan ditandai untuk dihapus.
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);
}
}
Saya memastikan semua poin, yaitu.
- Manajer tugas ditutup
- Konsol layanan ditutup.
- Semua contoh MMC ditutup.
- Layanan dihentikan
- Layanan tidak terbuka di debugger di Visual Studio...
Tapi itu tidak berhasil. Layanan tidak dapat dihapus instalasinya sampai saya me-reboot sistem (menghapus registri yang tertaut ke layanan juga tidak berhasil).
Saya telah memeriksa parameter yang saya teruskan ke fungsi-fungsi ini, dan tampaknya parameter tersebut benar.
Apa lagi yang harus saya periksa, untuk memastikan instalasi yang benar, atau instalasi berhasil?
szDirectory
berisi jalur lengkap ke layanan yang dapat dieksekusi, dan bukan (seperti yang disarankan oleh nama variabel) hanya jalur ke direktori tempat layanan dapat dieksekusi? Saat mencopot pemasangan, apa hasil dari panggilan ke QueryServiceStatusEx? - person Harry Johnston   schedule 12.10.2016