Как отключить службу через Delphi?
Я использую подпрограмму, которая может запускать и останавливать службы через Delphi, но я также должен иметь возможность отключать их, возможно ли это?
Ответы
Ответ 1
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);
Ответ 2
Откройте службу OpenService
, а затем отключите ее, передав Service_Disabled
в качестве параметра dwStartType
для ChangeServiceConfig
. Укажите нулевой указатель или Service_No_Change
для остальных параметров, так как вы не заинтересованы в их изменении.
Ответ 3
Вы можете использовать файл JclSvcCtrl.pas из библиотеки компонентов JEDI (JCLI).
Я написал псевдо-пример, который вы могли бы использовать. Однако имейте в виду, что я не тестировал его. Но таким образом он должен работать (ошибки проверки опущены):
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;
Ответ 4
Помимо использования предыдущих методов, если вам нужно больше контроля, вы можете использовать WMI.
С Win32_Service класс имеет доступ ко всей информации об услугах, установленных на машине, и вы можете иметь доступ к методам: Start, Stop, Pause, Resume, Interrogate, Create, Delete, Change, ChangeStartMode...
Здесь (Web/SourceForge) вы можете найти набор компонентов для работы с WMI (библиотека компонентов GLibWMI); Есть один, называемый CServiceInfo, который дает вам всю информацию и некоторые методы этого класса.
В дополнение к пакету есть несколько демонстраций; Один называется (ServiceControl) и реализует все методы.
![alt text]()
Все пакеты включены в комплект поставки. Посмотрите код, который может быть полезен для вас.
С уважением.
Ответ 5
Это то, что я использую
Это просто небольшая обертка вокруг некоторых Функции API Windows, которые мы нашли полезными для обработки NT-сервисов. Это позволяет вам для запроса, запуска, остановки, паузы и включить/отключить 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;