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

Как получить список установленных служб 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;

Комментарии

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