Как я могу отключить сервис через Delphi?

Я использую стандартную программу, которая может запустить и остановить сервисы через Delphi, но я также должен быть в состоянии отключить их, действительно ли это возможно?

15
задан Eder Gusatto 8 March 2010 в 13:23
поделиться

5 ответов

ShellExecute(0, nil, 'cmd.exe', 'sc config "the service name" start=disabled', nil, SW_HIDE);
ShellExecute(0, nil, 'cmd.exe', 'sc config "the service name" start=auto', nil, SW_HIDE);
ShellExecute(0, nil, 'cmd.exe', 'sc config "the service name" start=demand', nil, SW_HIDE);
5
ответ дан 1 December 2019 в 00:49
поделиться

Откройте службу с помощью OpenService, а затем отключите ее, передав Service_Disabled в качестве dwStartType параметра для ChangeServiceConfig. Укажите нулевой указатель или Service_No_Change для остальных параметров, поскольку вы не заинтересованы в их изменении.

19
ответ дан 1 December 2019 в 00:49
поделиться

Это то, что я использую

Это просто небольшая оболочка для некоторых функций Windows API, которые мы сочли полезными для обрабатывать NT-Services. Он позволяет запрашивать, запускать, останавливать, приостанавливать и включать / отключать NT-службы в локальной или удаленной системе.

http://blog.marcduerst.com/post/How-to-use-TServiceManager-to-manage-Windows-services.aspx

Что позволяет писать «красивый» код delphi;)

procedure DisableService(ServiceName: PChar);
var SM: TServiceManager;
begin
  SM:=TServiceManager.Create;
   try
     SM.Connect;
     SM.OpenServiceConnection(ServiceName);

   //not working with TServiceManager as is
   //but its easy to fix, see below        
    SM.DisableService;


   finally
    SM.Free;
   end;
end;

Раздел DisableService не был написан, но все, что нужно, это

 procedure TServiceManager.DisableService;
 begin
   ChangeServiceConfig(ServiceHandle, SERVICE_NO_CHANGE,SERVICE_DISABLED,SERVICE_NO_CHANGE, nil, nil, nil, nil, nil, nil, nil);
 end;
3
ответ дан 1 December 2019 в 00:49
поделиться

Вы можете использовать файл JclSvcCtrl.pas из библиотеки компонентов JEDI (JCL). Я написал псевдо-пример, который вы можете использовать. Однако имейте в виду, что я не тестировал это. Но таким образом он должен работать (проверка ошибок опущена):

M := TJclSCManager.Create;
M.Refresh(true);  //Not sure if true is needed or not (refresh all services)
For i := 0 to M.ServiceCount -1 do
begin
  S := M.Services[i]; //TJclNtService
  if CompareText(S.ServiceName, 'bla') then
  begin
    S.Stop;
    S.StartType := sstDisabled;   
    S.Commit;
    break;
  end;
end;
8
ответ дан 1 December 2019 в 00:49
поделиться

Помимо использования предыдущих методов, если вам нужен больший контроль, вы можете использовать WMI.
С класс Win32_Service имеет доступ ко всей информации о службах, установленных на машине, и вы можете иметь доступ к методам: Start, Stop, Pause, Resume, Interrogate, Create, Delete , Change, ChangeStartMode ...

Здесь ( Web / SourceForge ) вы можете найти набор компонентов для работы с WMI ( Библиотека компонентов GLibWMI ) ; Есть один под названием CServiceInfo , который дает вам всю информацию и некоторые методы этого класса.

В дополнение к пакету есть несколько демонстраций; Один называется (ServiceControl) и реализует все методы.

alt text

Все пакеты включены в исходный код. Посмотрите код, который может быть вам полезен.

С уважением.

7
ответ дан 1 December 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: