2013-06-07 2 views
4

Я пытаюсь прочитать Windows EventLog с WMI -> Win32_NTEventlogFile. Я использую пример кода из инструмента "WMI Delphi Code Creator" (link to WMI tutorial)Как я могу прочитать параметры WMI «Данные» и «InsertionStrings»?

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". Но я получаю ошибку: Вариант типа (Array Variant) не может быть преобразовано в тип (OleStr)

Как читать/отобразить эти параметры?

+0

Пожалуйста, не ставьте тег информацию в заголовке. Система маркировки здесь очень хороша в классификации вещей и не нуждается в помощи. :-) Пожалуйста, см. [Если вопросы включают «теги» в их названиях?] (Http://meta.stackexchange.com/q/19190/172661), где голосование кажется «Нет», , Благодарю. –

+0

ОК, я понимаю. Спасибо – niko2post

ответ

5

Согласно найденной документации here, Данные и InsertionString - это массив байтов/строк;

Ниже я использовал его для повторения их в цикле 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

+4

Другим вариантом является использование методов VarArrayLowBound и VarArrayHighBound для поиска границ массива. – RRUZ

+0

Спасибо, Matheus, это он – niko2post

+0

@RRUZ +1, не могли бы вы сказать, что лучше в этом сценарии? – EProgrammerNotFound

Смежные вопросы