2015-12-17 4 views
4

Я хотел бы сделать функцию удаления услуги.Delphi: make ServiceDelete function

Function ServiceDelete(sMachine, sService: String): Boolean; 
Var 
    schm, schs: SC_Handle; 
    ss: TServiceStatus; 
    dwChkP: dword; 
Begin 
    Result := False; 
    schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT); 
    If schm > 0 Then Begin 
    schs := OpenService(schm, PChar(sService), SERVICE_STOP Or SERVICE_QUERY_STATUS); 
    If schs > 0 Then Begin 
     If (QueryServiceStatus(schs, ss)) Then Begin 
     While (SERVICE_STOPPED <> ss.dwCurrentState) Do Begin 
      ControlService(schs, SERVICE_CONTROL_STOP, ss); 
      dwChkP := ss.dwCheckPoint; 
      Sleep(ss.dwWaitHint); 
      If (Not QueryServiceStatus(schs, ss)) Then 
      Break; 
      If (ss.dwCheckPoint < dwChkP) Then 
      Break; 
     End; 
     End; 
     DeleteService(schs); 
     CloseServiceHandle(schs); 
    End; 
    CloseServiceHandle(schm); 

    // If service does not exist, then everything is fine. 
    schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT); 
    If schm > 0 Then Begin 
     schs := OpenService(schm, PChar(sService), SERVICE_QUERY_STATUS); 
     If schs = 0 Then Begin 
     If GetLastError = ERROR_SERVICE_DOES_NOT_EXIST Then 
      Result := True; 
     End Else Begin 
     CloseServiceHandle(schs); 
     End; 
     CloseServiceHandle(schm); 
    End; 
    End; 
End; 

Он открывает диспетчер служб, открывает службу, выполняет DeleteService, но не удаляет службу. Функция возвращает false, и служба все еще существует. Что я делаю неправильно?

+0

Вы не появляются, чтобы проверить на наличие ошибок последовательно. Почему нет? –

ответ

4

Согласно DeleteService и Service Security and Access Rights, вам нужно добавить STANDARD_RIGHTS_REQUIRED = $F0000; получить

schs := OpenService(schm, PChar(sService), STANDARD_RIGHTS_REQUIRED or SERVICE_STOP Or SERVICE_QUERY_STATUS); 

Кроме того, важно, чтобы запустить программу с правами администратора и проверить каждую функцию результат OK, как указано в комментариях.

EDIT:

Благодаря комментарий от Реми Лебо, его можно сузить ее дальше просто требует стандартного права доступа Winapi.Windows._DELETE = $00010000; получить

schs := OpenService(schm, PChar(sService), Winapi.Windows._DELETE or SERVICE_STOP Or SERVICE_QUERY_STATUS); 
+0

Большое спасибо. Решение STANDARD_RIGHTS_REQUIRED было решением. (Я знал правило прав администратора.) – trob

+0

Отлично :) Я скорректировал ответ соответственно. –

+1

@trob Если вы проверили ошибки, вам сказали бы, что доступ запрещен. Я не понимаю, почему кто-то сознательно игнорирует проверку ошибок. Система поможет вам, если вы только позволите. –

Смежные вопросы