首页  编辑  

使用WMI获取进程信息

Tags: /超级猛料/OS.操作系统/Process.进程/   Date Created:

Get Information about a Process using WMI?

http://www.swissdelphicenter.ch/torry/showcode.php?id=2135

uses

 ActiveX, WbemScripting_TLB;

function ADsEnumerateNext(pEnumVariant: IEnumVARIANT; cElements: ULONG;

 var pvar: OleVARIANT; var pcElementsFetched: ULONG): HRESULT; safecall; external 'activeds.dll';

procedure DumpWMI_Process(Process: SWBemObject);

var

 Enum: IEnumVARIANT;

 varArr: OleVariant;

 lNumElements: ULong;

 SProp: ISWbemProperty;

 Prop: OleVariant;

 PropName: string;

 PropType: string;

 PropValue: string;

begin

 Form1.Memo1.Lines.Add('+ WMI Path: ' + Process.Path_.Path);

 Enum := Process.Properties_._NewEnum as IEnumVariant;

 while (Succeeded(ADsEnumerateNext(Enum, 1, VarArr, lNumElements))) and

   (lNumElements > 0) do

 begin

   if Succeeded(IDispatch(varArr).QueryInterface(SWBemProperty, SProp)) and

     Assigned(SProp) then

   begin

     try

       PropName  := SProp.Name;

       Prop := SProp.Get_Value;

       PropType := VarTypeAsText(VarType(Prop));

       PropValue := VarToStr(Prop);

       Form1.Memo1.Lines.Add('  + ' + PropName + '[' + PropType + '] = ' + PropValue);

     except

       on E: Exception do

       begin

         // WriteLn(ErrOutput, PropName, ': ', E.Message);

       end;

     end;

   end;

 end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

 Server: string;

 Enum: IEnumVARIANT;

 varArr: OleVariant;

 lNumElements: ULong;

 AName: array[0..255] of Char;

 ASize: DWORD;

begin

 if (ParamCount = 0) then

 begin

   Server := '';

   ASize  := SizeOf(AName) - 1;

   if GetComputerName(@AName, ASize) then Server := AName;

 end

 else

 begin

   Server := ParamStr(1);

 end;

 try

   Memo1.Lines.BeginUpdate;

   Enum := CoSWbemLocator.Create.ConnectServer(Server, 'root\cimv2', '',

     '', '', '', 0, nil).ExecQuery('Select * from Win32_Process', 'WQL',

     wbemFlagBidirectional, nil)._NewEnum as IEnumVariant;

   while (Succeeded(ADsEnumerateNext(Enum, 1, varArr, lNumElements))) and

     (lNumElements > 0) do

   begin

     DumpWMI_Process(IUnknown(varArr) as SWBemObject);

   end;

 finally

   Memo1.Lines.EndUpdate;

 end;

end;

{

You need the WbemScripting_TLB unit, which you can create by installing the type library

<Windows System32>\wbem\wbemdisp.tlb type library using the "Project|Import type library" menu option.

}

img_4447.bmp (617.0KB)