Instalasi/uninstall layanan Windows di Windows 10

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?


person user1173240    schedule 11.10.2016    source sumber
comment
Apa yang membuat Anda berpikir Anda perlu mematikan instance mmc? Itu adalah hal yang sangat mengerikan yang dilakukan terhadap pengguna akhir!   -  person Harry Johnston    schedule 12.10.2016
comment
Mohon informasi lebih lanjut. Bagaimana Anda mencoba memulai layanan, dan apa pesan kesalahan tepatnya? Apakah Anda yakin bahwa 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
comment
Juga, apa yang TraceAdvice() lakukan?   -  person Harry Johnston    schedule 12.10.2016


Jawaban (1)


Anda harus menghentikan layanan terlebih dahulu, jika tidak maka layanan akan terjebak dalam status penghapusan yang tertunda ini. Membunuh layanan secara paksa tidak sama dengan menghentikannya. Dari area dokumentasi yang sama, Anda perlu ControlService(SERVICE_CONTROL_STOP).

person Luke    schedule 11.10.2016