Внешний вид сайта:

Как получить список установленных служб Windows

Вам нужно получить список активных, неактивных или всех служб Windows? Следующая функция поможет это сделать.

Получеем список всех служб Windows и загружаем его в ListBox

uses
  { ... }, WinSvc;
 
{ ... }
 
const
   //
   // Типы служб
   //
   SERVICE_KERNEL_DRIVER       = $00000001;
   SERVICE_FILE_SYSTEM_DRIVER  = $00000002;
   SERVICE_ADAPTER             = $00000004;
   SERVICE_RECOGNIZER_DRIVER   = $00000008;
 
   SERVICE_DRIVER              =
     (SERVICE_KERNEL_DRIVER or
      SERVICE_FILE_SYSTEM_DRIVER or
      SERVICE_RECOGNIZER_DRIVER);
 
   SERVICE_WIN32_OWN_PROCESS   = $00000010;
   SERVICE_WIN32_SHARE_PROCESS = $00000020;
   SERVICE_WIN32               =
     (SERVICE_WIN32_OWN_PROCESS or
      SERVICE_WIN32_SHARE_PROCESS);
 
   SERVICE_INTERACTIVE_PROCESS = $00000100;
 
   SERVICE_TYPE_ALL            =
     (SERVICE_WIN32 or
      SERVICE_ADAPTER or
      SERVICE_DRIVER  or
      SERVICE_INTERACTIVE_PROCESS);
 
{ ... }
 
function ServiceGetList(
   sMachine : string;
   dwServiceType,
   dwServiceState : DWord;
   slServicesList : TStrings )
   : boolean;
 const
   { Количество служб не более 4096
    Уменьшить при необходимости }
   cnMaxServices = 4096;
 
 type
   TSvcA = array[0..cnMaxServices]
           of TEnumServiceStatus;
   PSvcA = ^TSvcA;
 
 var
   //
   // временная переменная
   j : integer;
 
   //
   // управление службами
   schm          : SC_Handle;
 
   //
   // байт нужно для буфера
   nBytesNeeded,
 
   //
   // количество служб
   nServices,
 
   //
   // указатель на следующую службу
   nResumeHandle : DWord;
 
   //
   // состояние службы
   ssa : PSvcA;
 begin
   Result := false;
 
   // подключаемся к управлению службами
   schm := OpenSCManager(
     PChar(sMachine),
     Nil,
     SC_MANAGER_ALL_ACCESS);
 
   // если удачно
   if(schm > 0)then
   begin
     nResumeHandle := 0;
 
     New(ssa);
 
     EnumServicesStatus(
       schm,
       dwServiceType,
       dwServiceState,
       ssa^[0],
       SizeOf(ssa^),
       nBytesNeeded,
       nServices,
       nResumeHandle );
 
     //
     // Предположим, что размер массива достаточен
 
     for j := 0 to nServices-1 do
     begin
       slServicesList.
         Add( StrPas(
           ssa^[j].lpDisplayName ) );
     end;
 
     Result := true;
 
     Dispose(ssa);
 
     // закрыть дескриптор управления службами
     CloseServiceHandle(schm);
   end;
 end;

Заполняем ListBox списком служб, установленных на компьютере

procedure TForm1.Button1Click(Sender: TObject);
begin
  ServiceGetList( '',
    SERVICE_WIN32,
    SERVICE_STATE_ALL,
    ListBox1.Items );
end;

Комментарии

Нет комментариев. Ваш будет первым!