Карта сайтаСсылкиКонтакты

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

PDF Печать
Статьи

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

 

Добавить комментарий


Защитный код
Обновить