Статьи по Delphi (028)…
Перечисление служб.
| Перечисление служб |
Code: //////////////////////////////////////////////////////////////////////////////// // // **************************************************************************** // * Project : Project1. // * Unit Name : Unit1. // * Purpose : Демо получения информации по сервисам. // * Author : Александр (Rouse_) Багель. // * Version : 1.00. // **************************************************************************** // Unit Unit1; Interface. Uses. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls, WinSvc; Type. TfrmMain = class(TForm). LvReport: TListView; RgServiceState: TRadioGroup; SbCount: TStatusBar; OpenDialog1: TOpenDialog; Procedure FormCreate(Sender: TObject); Procedure rgServiceStateClick(Sender: TObject); Private. Procedure EnumServices(const State: DWORD); End; Var. FrmMain: TfrmMain; Implementation. {$R *.dfm}. Procedure TfrmMain.EnumServices(const State: DWORD); Var. HSCObject, hService: SC_HANDLE; LpServices, TmpEnum: PEnumServiceStatus; LpServiceConfig: PQueryServiceConfig; I, cbBuffSize, pcbBytesNeeded, LpServicesReturned, lpResumeHandle: DWORD; Begin. LvReport.Items.BeginUpdate; Try. LvReport.Items.Clear; // Открываем менеджер сервисов. HSCObject := OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE); If hSCObject <> 0 then. Try. LpResumeHandle := 0; LpServices := nil; // Смотрим сколько нужно памяти чтобы получить информацию. EnumServicesStatus(hSCObject, SERVICE_WIN32, State, LpServices^, 0, pcbBytesNeeded, lpServicesReturned, lpResumeHandle); If GetLastError = ERROR_MORE_DATA then. Begin. // Выделяем нужную память. GetMem(lpServices, pcbBytesNeeded); Try. CbBuffSize := pcbBytesNeeded; // Получаем требуемую информацию по установленным сервисам. If EnumServicesStatus(hSCObject, SERVICE_WIN32, State, LpServices^, cbBuffSize, pcbBytesNeeded, lpServicesReturned, lpResumeHandle) then. Begin. TmpEnum := lpServices; // Бежим в цикле по записям. For I := 0 to lpServicesReturned - 1 do. Begin. // Выводим данные на экран. With lvReport.Items.Add do. Begin. // Наименование сервиса. Caption := TmpEnum^.lpServiceName; // Описание сервиса. SubItems.Add(TmpEnum^.lpDisplayName); // Состояние. Case TmpEnum^.ServiceStatus.dwCurrentState of. SERVICE_RUNNING: SubItems.Add('Работает'); SERVICE_STOPPED: SubItems.Add('Остановлен'); Else. SubItems.Add('Неизвестно'); End; // Для дополнительной информаци по сервису получаем описатель сервиса. HService := OpenService(hSCObject, TmpEnum^.lpServiceName, SERVICE_QUERY_CONFIG); If hService <> 0 then. Try. // Смотрим сколько нужно памяти. QueryServiceConfig(hService, nil, 0, pcbBytesNeeded); If GetLastError = ERROR_INSUFFICIENT_BUFFER then. Begin. CbBuffSize := pcbBytesNeeded; // Берем память. GetMem(lpServiceConfig, pcbBytesNeeded); Try. // Получаем расширенную информацию по сервису. If QueryServiceConfig(hService, lpServiceConfig, CbBuffSize, pcbBytesNeeded) then. Begin. // Путь к сервису. SubItems.Add(lpServiceConfig^.lpBinaryPathName); // Доступ к рабочему столу. If (lpServiceConfig^.dwServiceType and SERVICE_INTERACTIVE_PROCESS) = SERVICE_INTERACTIVE_PROCESS then. Begin. SubItems.Add('Да'); LpServiceConfig^.dwServiceType := LpServiceConfig^.dwServiceType - SERVICE_INTERACTIVE_PROCESS; End. Else. SubItems.Add('Нет'); // Тип сервиса. Case lpServiceConfig^.dwServiceType of. SERVICE_WIN32_OWN_PROCESS: SubItems.Add('Одиночный'); SERVICE_WIN32_SHARE_PROCESS: SubItems.Add('Не одиночный'); Else. SubItems.Add('Неизвестный тип службы'); End; // Группа. SubItems.Add(lpServiceConfig^.lpLoadOrderGroup); // Тип запуска. Case lpServiceConfig^.dwStartType of. SERVICE_AUTO_START: SubItems.Add('Автоматический'); SERVICE_DEMAND_START: SubItems.Add('Вручную'); SERVICE_DISABLED: SubItems.Add('Отключен'); End; End; // Завершающее освобождение памяти. Finally. FreeMem(lpServiceConfig); End; End; Finally. CloseServiceHandle(hService); End; End; Inc(TmpEnum); End; End; Finally. FreeMem(lpServices); End; End; Finally. CloseServiceHandle(hSCObject); End; Finally. LvReport.Items.EndUpdate; SbCount.Panels.Items[0].Text := ' Общее количество: ' + IntToStr(lvReport.Items.Count); End; End; Procedure TfrmMain.FormCreate(Sender: TObject); Begin. RgServiceState.OnClick(nil); End; Procedure TfrmMain.rgServiceStateClick(Sender: TObject); Begin. // В зависимости от выбранного RadioItem перечисляем - // все сервисы, только активные или неактивные. If rgServiceState.ItemIndex = 0 then. EnumServices(SERVICE_STATE_ALL). Else. EnumServices(rgServiceState.ItemIndex); End; End.
Взято из http://forum.sources.ru.
Автор: Rouse_
©Drkb::02242.