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

var
    Computer,
    Service: string;

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

    param: PWideChar;
    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_START or SERVICE_QUERY_STATUS);
    if (scsh > 0) then
    begin
      chkP := 0;
      param := '';
      if (StartService(scsh, 0, param)) then // Отправляем команду на старт
      begin                                  // и если удалось, ждём
        while (QueryServiceStatus(scsh, ss)) and     // пока можем запрашивать статус
              (ss.dwCheckPoint >= chkP) and          // и запуск не зациклился
              (ss.dwCurrentState <> SERVICE_RUNNING) // и сервис ещё не стартовал.
              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_RUNNING = ss.dwCurrentState then
  begin
    // Сервис запустился
  end
    else
  begin
    // Сервис не запустился, пора посмотреть код из le
  end;
end.

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

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

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

Метки: