Я использую подпрограмму, которая может запускать и останавливать службы через Delphi, но мне также нужно иметь возможность отключать их, возможно ли это?
Как я могу отключить службу через Delphi?
Ответы (6)
Откройте службу с помощью OpenService, а затем отключите ее, передав Service_Disabled в качестве dwStartType для ChangeServiceConfig. Укажите нулевой указатель или Service_No_Change для остальных параметров, поскольку вы не заинтересованы в их изменении.
Вы можете использовать файл 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;
Помимо использования предыдущих методов, если вам нужен больший контроль, вы можете использовать WMI.
С Класс Win32_Service имеет доступ ко всей информации о службах, установленных на машине, и вы можете иметь доступ к методам: Start, Stop, Pause, Resume, Interrogate, Create, Delete, Change, ChangeStartMode. ..
Здесь (Интернет / SourceForge) можно найти набор компонентов для работы с WMI (Библиотека компонентов GLibWMI); Есть один, называемый CServiceInfo, который предоставляет вам всю информацию и некоторые методы этого класса.
В дополнение к пакету есть несколько демо-версий; Один называется (ServiceControl) и реализует все методы.
Весь пакет включает исходный код. Посмотрите код, он может быть вам полезен.
С уважением.
это то, что я использую
Это всего лишь небольшая оболочка для некоторых функций 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;
Другой вариант — использовать модуль 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;
а>