如何读取WMI参数“Data”和“InsertionStrings”?

时间:2013-06-07 09:23:04

标签: delphi wmi

我尝试使用WMI阅读Windows EventLog - > Win32_NTEventlogFile。我使用工具“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;

我尝试读取参数“FWbemObject.Data”和“FWbemObject.InsertionStrings”。 但我得到错误:类型的变体(数组变体)无法转换为类型(OleStr)

如何阅读/显示此参数?

1 个答案:

答案 0 :(得分:5)

根据here找到的文件, Data和InsertionString是Byte / String;

的数组

下面我用它在for循环中迭代它们,我不知道是否有任何意义,但你可以用它作为一个例子,做你需要的任何事情:)。

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;

这个link中有几个例子,但它是在VB中编写的

相关问题