Mega Code Archive

 
Categories / Delphi / System
 

Get information about a process using wmi

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. }