Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.01;
Скачать: CL | DM;

Вниз

services   Найти похожие ветки 

 
oleggar ©   (2005-12-12 16:42) [0]

Как показать в  Delphi под Windows NT на форме список всех процессов ,как по ctrl-alt-del или Администрирование/службы ?интересуют только службы , а не exe .сразу скажу ,многие известные примеры не показывают служебные процессы или вообще не работают .Так что пример должен быть хорош ,то есть показать службы server и telnet (хоть если они запущены) ,а то у меня показывает только Messenger и MS SQL


 
Игорь Шевченко ©   (2005-12-12 17:18) [1]

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, HSObjectList, ComCtrls, StdCtrls, Menus, ExtCtrls;

type
 TServiceItem = class
 private
   FStatus : Integer;
   FStartupType : Integer;
   FDisplayName: string;
   FDescription: string;
   FUserName: string;
   FName: string;
   function GetStartupType: string;
   function GetStatus: string;
 public
   constructor Create (AStatus: Integer; AStartupType: Integer);
   property Name: string read FName write FName;
   property DisplayName: string read FDisplayName write FDisplayName;
   property Description: string read FDescription write FDescription;
   property Status: string read GetStatus;
   property StartupType: string read GetStartupType;
   property UserName: string read FUserName write FUserName;
 end;

 TServiceList = class(THSObjectList)
 private
   function GetItems(I: Integer): TServiceItem;
 public
   procedure EnumServices;
   property Items[I: Integer]: TServiceItem read GetItems; default;
 end;

 THSSCMHelper = class
 private
   FSCM: THandle;
 public
   constructor Create (AHScm : THandle);
   function GetServiceDescription (const ServiceName: string): string;
 end;

 TfMain = class(TForm)
   MainMenu1: TMainMenu;
   File1: TMenuItem;
   Savereport1: TMenuItem;
   N1: TMenuItem;
   Exit1: TMenuItem;
   SaveDialog: TSaveDialog;
   PanelClient: TPanel;
   ShapeTop: TShape;
   MemoDescription: TMemo;
   ListView: TListView;
   Label1: TLabel;
   Label2: TLabel;
   Shape1: TShape;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure ListViewSelectItem(Sender: TObject; Item: TListItem;
     Selected: Boolean);
   procedure Exit1Click(Sender: TObject);
 private
   FServiceList: TServiceList;
   procedure DisplayServices;
 end;

var
 fMain: TfMain;

implementation
uses
 WinSvc, HsAdvApi;

{$R *.dfm}

{ TServiceItem }

constructor TServiceItem.Create(AStatus, AStartupType: Integer);
begin
 FStatus := AStatus;
 FStartupType := AStartupType;
end;

function TServiceItem.GetStartupType: string;
begin
 Result := IntToStr(FStartupType);
end;

function TServiceItem.GetStatus: string;
begin
 if FStatus = SERVICE_RUNNING then
   Result := "Running"
 else if FStatus = SERVICE_STOPPED then
   Result := "Stopped"
 else
   Result := IntToStr(FStatus);
end;

{ TServiceList }

procedure TServiceList.EnumServices;
var
 hSCM: THandle;
 rc: Boolean;
 ResumeHandle: DWORD;
 Buffer: Pointer;
 BufferSize: DWORD;
 BytesNeeded: DWORD;
 NumberOfServices: DWORD;
 Error: DWORD;
 ServicesData: PEnumServiceStatusProcessArrayA;
 I: Integer;
 Item: TServiceItem;
 SCMHelper: THSSCMHelper;
begin
 Clear;
 hSCM := OpenSCManager(nil, nil,
   SC_MANAGER_CONNECT or SC_MANAGER_ENUMERATE_SERVICE);
 if hSCM = 0 then
   RaiseLastOSError;
 SCMHelper:= THSSCMHelper.Create(hSCM);
 ResumeHandle := 0;
 try
   EnumServicesStatusExA(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32,
       SERVICE_STATE_ALL, nil, 0, BytesNeeded, NumberOfServices,
       ResumeHandle, nil);
   Error := GetLastError;
   if (Error <> ERROR_INSUFFICIENT_BUFFER) and
      (Error <> ERROR_MORE_DATA) then
     RaiseLastOSError;
   BufferSize := BytesNeeded;
   GetMem(Buffer, BufferSize);
   try
     rc := EnumServicesStatusExA(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32,
       SERVICE_STATE_ALL, Buffer, BufferSize, BytesNeeded, NumberOfServices,
       ResumeHandle, nil);
     if not rc then
       RaiseLastOSError;
     ServicesData := Buffer;
     for I:=0 to Pred(NumberOfServices) do begin
       Item := TServiceItem.Create(
         ServicesData^[I].ServiceStatusProcess.dwCurrentState,
         0);
       Item.Name := ServicesData^[I].lpServiceName;
       Item.DisplayName := ServicesData^[I].lpDisplayName;
       Item.Description := SCMHelper.GetServiceDescription(Item.Name);
       Add(Item);
     end;
   finally
     FreeMem(Buffer);
   end;
 finally
   SCMHelper.Free;
   CloseServiceHandle(hSCM)
 end;
end;

function TServiceList.GetItems(I: Integer): TServiceItem;
begin
 Result := TServiceItem(inherited Items[I]);
end;

procedure TfMain.DisplayServices;
var
 I: Integer;
begin
 ListView.Items.Clear;
 for I:=0 to Pred(FServiceList.Count) do
   if FServiceList[I].Status = "Running" then
     with ListView.Items.Add do begin
       Data := FServiceList[I];
       Caption := FServiceList[I].Name;
       SubItems.Add (FServiceList[I].DisplayName);
       SubItems.Add (FServiceList[I].Status);
     end;
end;

procedure TfMain.FormCreate(Sender: TObject);
begin
 FServiceList := TServiceList.Create;
 FServiceList.EnumServices;
 DisplayServices;
end;

procedure TfMain.FormDestroy(Sender: TObject);
begin
 FServiceList.Free;
end;

{ THSSCMHelper }

constructor THSSCMHelper.Create(AHScm: THandle);
begin
 FSCM:= AHScm;
end;

function THSSCMHelper.GetServiceDescription(
 const ServiceName: string): string;
var
 hService: THandle;
 BytesNeeded: DWORD;
 Buffer: Pointer;
 BufferSize: DWORD;
 Error: DWORD;
 rc: Boolean;
begin
 Result := "";
 hService := OpenService(FSCM, PChar(ServiceName), SERVICE_QUERY_CONFIG);
 if hService = 0 then
   RaiseLastOSError;
 try
   QueryServiceConfig2A(hService, SERVICE_CONFIG_DESCRIPTION, nil, 0,
     BytesNeeded);
   Error := GetLastError;
   if (Error <> ERROR_INSUFFICIENT_BUFFER) and
      (Error <> ERROR_MORE_DATA) then
     RaiseLastOSError;
   BufferSize := BytesNeeded;
   GetMem(Buffer, BufferSize);
   try
     rc := QueryServiceConfig2A(hService, SERVICE_CONFIG_DESCRIPTION,
       Buffer, BufferSize, BytesNeeded);
     if not rc then
       RaiseLastOSError;
     Result := PServiceDescriptionA(Buffer).lpDescription;
   finally
     FreeMem(Buffer);
   end;
 finally
   CloseServiceHandle(hService);
 end;
end;

procedure TfMain.ListViewSelectItem(Sender: TObject; Item: TListItem;
 Selected: Boolean);
begin
 if Assigned(ListView.Selected) and Assigned(ListView.Selected.Data) then
   with TServiceItem(ListView.Selected.Data) do
     MemoDescription.Text := Description;
end;

procedure TfMain.Exit1Click(Sender: TObject);
begin
 Close;
end;



 
oleggar ©   (2005-12-12 17:46) [2]

a THSObjectList.pas где взять ?без него не работает .да и пример использования модуля  можно найти ?


 
Игорь Шевченко ©   (2005-12-12 17:56) [3]

oleggar ©   (12.12.05 17:46) [2]

Ты спросил - как вывести. Я показал. Ты не просил - дайте мне готовую программу, которая будет компилироваться у меня. Практически весь код, который я выкладываю, является основой для творческой переработки. Удачи.


 
Digitman ©   (2005-12-12 18:06) [4]


> интересуют только службы , а не exe


галиматья.
в огороде бузина, а в Киеве дядька.


 
Leonid Troyanovsky ©   (2005-12-12 18:34) [5]


> Digitman ©   (12.12.05 18:06) [4]

> > интересуют только службы , а не exe

> галиматья.


Чего-то ты сегодня не в духе :)

Нонче службы могут быть и в dll, только MS не спешит радовать
своих поклонников, видимо, подозревая некоторые негативные
последствия от публикования интерфейсов того ж svchost.

--
Regards, LVT.


 
VirEx ©   (2005-12-12 18:53) [6]

CreateToolhelp32Snapshot
Heap32First
Heap32ListFirst
Heap32ListNext
Heap32Next
Module32First
Module32Next
Process32First
Process32Next
Thread32First
Thread32Next
Toolhelp32ReadProcessMemory


 
VirEx ©   (2005-12-12 18:56) [7]

в Delphi: меню Help -> Windows SDK


 
Leonid Troyanovsky ©   (2005-12-12 19:13) [8]


> VirEx ©   (12.12.05 18:56) [7]
> в Delphi: меню Help -> Windows SDK


Как там было про Дзержинского?
- Душевный человек, мог бы и расстрелять.

--
Regards, LVT.


 
kami ©   (2005-12-12 22:44) [9]

http://www.kladovka.net.ru/index.cgi?pid=board&rid=289



Страницы: 1 вся ветка

Текущий архив: 2006.01.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.035 c
11-1116038421
uli
2005-05-14 06:40
2006.01.01
разрешение экрана


2-1134542066
ALex_
2005-12-14 09:34
2006.01.01
Языки


14-1134052240
begin...end
2005-12-08 17:30
2006.01.01
С Днём рождения! 8 декабря


14-1134297044
markers
2005-12-11 13:30
2006.01.01
Список &amp;&amp; html


2-1134507375
drink
2005-12-13 23:56
2006.01.01
Путь к файлу в TOpenDialog