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

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


person Eder Gusatto    schedule 08.03.2010    source источник


Ответы (6)


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

person Rob Kennedy    schedule 08.03.2010
comment
Также имейте в виду, что пользователь должен иметь соответствующие права для изменения конфигурации службы. - person ; 08.03.2010

Вы можете использовать файл 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;
person ChristianWimmer    schedule 11.03.2010
comment
Конечно, вы также можете использовать M.FindService. Он делает точно так же! - person ChristianWimmer; 11.03.2010
comment
Я большой поклонник библиотеки JEDI, я определенно использую ее. - person Eder Gusatto; 11.03.2010

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

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

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

альтернативный текст

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

С уважением.

person Germán Estévez -Neftalí-    schedule 09.03.2010
comment
El proyecto tiene muy buena pinta Neftalí... Felicitaciones por la iniciativa! - person jachguate; 10.03.2010
comment
Грасиас Хуан Антонио. La verdad es que aun está en la primera fase, pero tiene muchas posibilidades para ampliar funcionalidades. Un привет. - person Germán Estévez -Neftalí-; 10.03.2010

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

Это всего лишь небольшая оболочка для некоторых функций API Windows, которые мы сочли полезными для работы с 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;
person Christopher Chase    schedule 08.03.2010
comment
Код Delphi был бы лучше, если бы он демонстрировал то, о чем просил Эдер, а не то, что, по его словам, он уже знает, как это сделать. - person Rob Kennedy; 09.03.2010
comment
да, вы правы, я не прочитал вопрос полностью, я обновлю его - person Christopher Chase; 22.03.2010
comment
Как жаль, сейчас ссылка битая - person Jerry Dodge; 30.01.2014
comment
Это ссылка на содержание блога, но нигде не могу найти загрузку. idev.ch/content/how-use-tservicemanager-manage- службы Windows - person Christopher Chase; 02.02.2014
comment
И это точная причина, по которой нам не нравятся ответы на SO, основанные на ссылках. Потому что эти ссылки со временем ломаются, и ответ становится бесполезным. - person Jerry Dodge; 17.07.2017
comment
Вот версия исходного кода: swissdelphicenter.ch/en/showcode.php ?id=1322. - person yonojoy; 26.05.2021

Другой вариант — использовать модуль DelphiVault ServiceManager . (см. также этот ответ):

var 
    SM: TServiceManager;
    Svc: TServiceInfo;
begin
    SM := TServiceManager.Create;
    try
        SM.Active := True; 
        Svc := SM.ServiceByName['MyServiceName'];
        Svc.SetStartType(ssDisabled);
    finally
        SM.Free;
    end;
end;  
person yonojoy    schedule 27.05.2021
comment
Имейте в виду, что необходимы соответствующие права доступа. - person yonojoy; 27.05.2021

person    schedule
comment
Это плохое управление услугами человека. sc.exe предназначен для использования командной строкой или сценариями и недоступен в более старых версиях Windows — приложение должно использовать SCM API. И если вы действительно хотите использовать SC, нет необходимости вызывать оболочку. Запустите sc.exe напрямую. - person ; 08.03.2010
comment
Я понимаю, что это не идеальное решение, но оно сработало так, как мне было нужно для конкретной проблемы. Я оцениваю решение OpenService для общего использования. - person Eder Gusatto; 09.03.2010
comment
Также учтите, что при использовании SCM API гораздо проще получить ошибки, если таковые имеются. Используя инструмент командной строки помимо кода выхода, вам, возможно, придется перехватывать и анализировать вывод, что более сложно и может зависеть от языка. Для быстрого и грязного решения это нормально, но я бы не стал использовать его как общее решение. Также проверьте JCL, IIRC, есть несколько классов для управления услугами. - person ; 09.03.2010