Search code examples
delphiwmi

How can i read WMI parameters "Data" and "InsertionStrings"?


I try to read the Windows EventLog with WMI -> Win32_NTEventlogFile. I use example code from the Tool "WMI Delphi Code Creator" (link to WMI tutorial)

procedure TEventLogsForm.GetWin32_NTLogEventInfo;
const
  WbemUser            ='';
  WbemPassword        ='';
  WbemComputer        ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService   : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NTLogEvent  Where Logfile="Application"','WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    try
      // ????
      if not VarIsNull(FWbemObject.Data) then
        Showmessage(IntToStr(Integer(FWbemObject.Data)));// Array of Uint8
      if not VarIsNull(FWbemObject.InsertionStrings) then
        Showmessage(String(FWbemObject.InsertionStrings));

    except
      on E:Exception do
      begin
        MessageDlg(E.Message, mtError, [mbOK], 0);
      end;
    end;

    FWbemObject:=Unassigned;
  end;
end;

I try to read the parameters "FWbemObject.Data" and "FWbemObject.InsertionStrings". But I get the error: Variant of type (Array Variant) could not be converted to type (OleStr)

How can to read / display this parameters?


Solution

  • According to documentation found here, Data and InsertionString is an array of Byte/String;

    Below I used it to iterate them in a for loop, I don't know if make any sense but you could use as an example, to do whatever you need :).

    procedure GetWin32_NTLogEventInfo;
    const
      WbemUser            ='';
      WbemPassword        ='';
      WbemComputer        ='localhost';
      wbemFlagForwardOnly = $00000020;
    var
      FSWbemLocator : OLEVariant;
      FWMIService   : OLEVariant;
      FWbemObjectSet: OLEVariant;
      FWbemObject   : OLEVariant;
      oEnum         : IEnumvariant;
      iValue        : LongWord;
      Insertion     : array of String;
      Data          : array of Byte;
      I: integer;
    begin;
      FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
      FWMIService   := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
      FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_NTLogEvent Where Logfile=''Application''','WQL',wbemFlagForwardOnly);
      oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
      while oEnum.Next(1, FWbemObject, iValue) = 0 do
      begin
        try
    
          if not VarIsNull(FWbemObject.Data) then
          begin
            Data := FWbemObject.Data;
            for I:= VarArrayLowBound(data,1) to VarArrayHighBound(data,1) do
              Showmessage(IntToStr(Data[I]));// Array of Uint8
          end;
    
          if not VarIsNull(FWbemObject.InsertionStrings) then
          begin
            Insertion := FWbemObject.InsertionStrings;            
            for I:= VarArrayLowBound(Insertion,1) to VarArrayHighBound(Insertion,1) do
              Showmessage(Insertion[I]);
          end;
    
        except
          on E:Exception do
          begin
            MessageDlg(E.Message, mtError, [mbOK], 0);
          end;
        end;
    
        FWbemObject:=Unassigned;
      end;
    end;
    

    There are several examples in this link, but it is writen in VB