Остановить службу Windows из программы на Delphi

uses Windows;
var
    Computer,
    Service: string;

    scmh,  // service control manager handle
    scsh: SC_Handle; // service handle
    ss: TServiceStatus;

    chkP: Cardinal;
    le: Cardinal;
begin
  Computer := ''; // Пустая строка - локальный компьютер
  Service  := 'Имя сервиса';
    // Получаем хэндл от Service Control Manager 
  scmh := OpenSCManager(PWideChar(Computer), nil, SC_MANAGER_CONNECT);
  if (scmh > 0) then
  begin
    // Получаем хэндл сервиса с правами на остановку и контроль статуса.
    scsh := OpenService(scmh, PWideChar(Service), SERVICE_STOP or SERVICE_QUERY_STATUS);
    if (scsh > 0) then
    begin
      chkP := 0;
      if (ControlService(scsh, SERVICE_CONTROL_STOP, ss)) then
      begin
        while (QueryServiceStatus(scsh, ss)) and
              (ss.dwCheckPoint >= chkP) and
              (ss.dwCurrentState <> SERVICE_STOPPED)
              do
        begin
          chkP := ss.dwCheckPoint;
          Sleep(ss.dwWaitHint);
        end;
        CloseServiceHandle(scsh);
      end
        else le := GetLastError;
    end
      else le := GetLastError;
    CloseServiceHandle(scmh);
  end
    else le := GetLastError;

  if SERVICE_STOPPED = ss.dwCurrentState then
  begin
    // Сервис остановлен
  end
    else
  begin
    // Остановка не удалась, пора посмотреть содержимое le
  end;

Разумеется, у вашей программы должен быть уровень привилегий, позволяющий остановку сервисов, иначе на одном из этапов в le вам вернётся ERROR_ACCESS_DENIED

Computer - имя компьютера, на котором вы собираетесь обратиться к Service Control Manager. Если оставите пустым, будет произведена попытка подключиться к локальному менеджеру.

Service - Имя сервиса, которое использовалось в функции CreateService. Для установленных сервисов его можно посмотреть через графический интерфейс Service Control Manager в свойствах службы. Это "Имя слукжбы", не путайте с "Отображаемым именем".

Метки: