Menu

Usuwanie serwisu

2024-07-27 - Usługi

 

//---------------------------------------------------------------------------
#include 
#include 
#include 
//---------------------------------------------------------------------------
bool __fastcall TForm1::DeinstallService(AnsiString SrvName)
{
    BOOL ret = true;
    SC_HANDLE scm;
    SC_HANDLE svc;
    UnicodeString blad;
    int retError = 0;
 
    scm = OpenSCManager(
        NULL,
        SERVICES_ACTIVE_DATABASE,
        SC_MANAGER_ALL_ACCESS
    );
    if( scm==NULL ){
       retError = GetLastError();
       switch(retError){
        case ERROR_ACCESS_DENIED: blad = "Brak uprawnień do menadżera usług"; break;
        case ERROR_DATABASE_DOES_NOT_EXIST: blad = "The specified database does not exist"; break;
        default: blad = "Nie udało się otworzyć menadżera usług, kod błędu: " + UnicodeString(GetLastError());
       }
       Vcl::Forms::Application->MessageBox(blad.c_str(), L"Błąd", MB_ICONERROR | MB_OK);
       return false;
    }
    svc = OpenService(
        scm,
        SrvName.c_str(),
        SERVICE_ALL_ACCESS
    );
    if( svc==NULL ){
 
       retError = GetLastError();
       if(retError == 1060)
         blad = "Usługa o podanej nazwie nie istnieje - kod błędu: 1060";
       else
         blad = "Błąd deinstalacji usługi, kod błędu: " + UnicodeString(retError);
       Vcl::Forms::Application->MessageBox(blad.c_str(),L"Błąd", MB_ICONERROR | MB_OK);
       CloseServiceHandle(scm);
       return false;
    }
    ret = DeleteService(svc);
    if(!ret){
       retError = GetLastError();
       switch(retError){
        case ERROR_ACCESS_DENIED: blad = "Brak uprawnień do menadżera usług"; break;
        case ERROR_INVALID_HANDLE: blad = "The specified handle is invalid."; break;
        case ERROR_SERVICE_MARKED_FOR_DELETE: blad = "The specified service has already been marked for deletion."; break;
        default: blad = "Nie udało się odinstalować usługi, kod błędu: " + UnicodeString(GetLastError());
       }
       Vcl::Forms::Application->MessageBox(blad.c_str(), L"Błąd", MB_ICONERROR | MB_OK);
    }
    CloseServiceHandle(svc);
    CloseServiceHandle(scm);
    return ret;
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if(DeinstallService(ServiceName->Text))
        Vcl::Forms::Application->MessageBox(L"Usługa została odinstalowana.", L"Deinstalacja usługi", MB_ICONINFORMATION | MB_OK);
}
//---------------------------------------------------------------------------

Uwaga!
Aby operacja się powiodła aplikacja musi mieć podniesione uprawnienia. Należy koniecznie w ustawieniach projektu włączyć opcję „Enable Administrator Privileges” znajdującą się w sekcji „Application”. W starszych wersjach środowiska ta opcja może być niedostępna, w takiej sytuacji należy dołączyć odpowiedni plik manifestu.