Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   EventLog speichern/in Anwendung importieren (https://www.delphipraxis.net/175257-eventlog-speichern-anwendung-importieren.html)

ByTheTime 9. Jun 2013 20:20

EventLog speichern/in Anwendung importieren
 
Moin,
ich möchte ein EventLog in mein Programm einlesen. Unter Computer>Verwalten kann man ja die Verschiedenen Eventlogs auch als *.txt-Datei speichern, was mir schon reicht. Das ganze möchte ich dann wieder in Delphi importieren. An sich ist das auch kein Problem, allerdings möchte ich auf Buttonklick, das ein bestimmtes, oder alle Eventlogs gespeichert werden, mit ich sie dann einlesen kann. Habe schon einige Beispiele gefunden, wie es mit der Windows PowerShell funktioniert, allerdings scheint mir das nicht die sauberste Lösung zu sein. Geht das auch anders? Noch besser wäre, die Daten direkt abzugreifen, ohne das überhaupt eine Datei gespeichert wird. Wobei ich hieran selbst zweifel :D

MfG
Lukas

Bummi 9. Jun 2013 23:48

AW: EventLog speichern/in Anwendung importieren
 
Hier gab es einen Beitrag dazu read the Windows EventLog with WMI

CCRDude 10. Jun 2013 07:54

AW: EventLog speichern/in Anwendung importieren
 
Das Binärformat der Dateien ist eigentlich recht simpel - ich schau mal, ob ich meine Unit von internen Abhängigkeiten befreien kann.

Edit: nicht so einfach, daher nur die wichtigsten Infos:
Delphi-Quellcode:
   TEventLogFixedHeader = packed record
      Length, Magic, MessageNumber, DateCreated, DateWritten, EventID: DWord;
      EventType, StringCount, EventCategory, ReservedFlags: Word;
      ClosingRecordNumber, StringOffset, UserSidLength, UserSidOffset, DataLength, DataOffset: DWord;
   end;

   TEventLogVariableHeader = record
      SourceName, ComputerName: string;
      SID: string;
      Strings: array of string;
      // Data
      // Pad
      Length: DWord;
   end;

ByTheTime 10. Jun 2013 17:41

AW: EventLog speichern/in Anwendung importieren
 
Danke erstmal für die antworten. Ich habe nochmal ein bisschen geforscht. Es gibt zwar tausende Beispiele zum schreiben in das EventLog, allerdings nicht, wie man es ausließt.

Das WMI Beispiel erscheint mir ganz schlüssig, allerdings hapert es hier an "VarArrayLowBound":

Delphi-Quellcode:
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) to VarArrayLowBound(Data) do // Fehler!
          Showmessage(IntToStr(Data[I])); // Array of Uint8
      end;

      if not VarIsNull(FWbemObject.InsertionStrings) then
      begin
        Insertion := FWbemObject.InsertionStrings;
        for I := VarArrayLowBound(Insertion) to VarArrayLowBound(Insertion) do // Fehler!
          Showmessage(Insertion[I]);
      end;

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

    FWbemObject := Unassigned;
  end;
end;
VarArrayLowBound verlangt den 2. Parameter "Dim" vom Typ Integer. Bin ich ehrlich gesgat etwas aufgeschmissen, weil ich nicht weiß, was DIM/Dim bedeutet :(

[EDIT]: Habe gearde was von der Jedi Komponente TJvNetEventLog erfahren. Die werde ich mir auch nochmal genauer anschauen :)

Bummi 10. Jun 2013 18:00

AW: EventLog speichern/in Anwendung importieren
 
Delphi-Quellcode:
      if not VarIsNull(FWbemObject.Data) then
      begin
        for I := VarArrayLowBound(FWbemObject.Data,1) to VarArrayLowBound(FWbemObject.Data,1) do
          Showmessage(IntToStr(FWbemObject.Data[I])); // Array of Uint8
      end;

      if not VarIsNull(FWbemObject.InsertionStrings) then
      begin
        for I := VarArrayLowBound(FWbemObject.InsertionStrings,1) to VarArrayLowBound(FWbemObject.InsertionStrings,1) do
          Showmessage(FWbemObject.InsertionStrings[I]);
      end;

ByTheTime 10. Jun 2013 19:13

AW: EventLog speichern/in Anwendung importieren
 
Okay danke :) Bin schon ein ganzes Stück weiter gekommen. Hier mal mein Code-Schnippsel. Ist zwar jetzt unschön programmiert, aber ich habe es jetzt für meine Experimete erstmal hingezweckt:

Delphi-Quellcode:
procedure TfrmMain.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); // Wird hier das Log angegeben?!
  oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumvariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    try

      if not VarIsNull(FWbemObject.Data) then
        if not VarIsNull(FWbemObject.InsertionStrings) then
        begin
          Data := FWbemObject.Data;
          Insertion := FWbemObject.InsertionStrings;
          for I := VarArrayLowBound(Data, 1) to VarArrayLowBound(Data, 1) do
            MLog.Lines.Add('Code ' + IntToStr(Data[I]) + ':' + Insertion[I]);
        end;

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

    FWbemObject := Unassigned;
  end;
end;
Allerdings weiß ich nicht, aus welchem Log er das ausließt :? Laut dem Code zufolge ja aus dem Application-Log. Ich kann das irgendwie in keinen sinvollen zusammenhang setzen :(

Bummi 10. Jun 2013 19:28

AW: EventLog speichern/in Anwendung importieren
 
Die Frage/Antwort aus dem Link war anscheinend schon beschränkt auf Knackpunkte mit den Arrays.
Der weiterführende Link auf Rodrigo's Seite zeigt was noch alles zu bekommen ist.
Gegf. sind ja die Projekte WMI Class Generator oder WMI Delphi Code Creator auch etwas für Dich.

ByTheTime 10. Jun 2013 20:35

AW: EventLog speichern/in Anwendung importieren
 
Ah danke, habe den link oben im 1. Post aus stack irgendwie eben erst bemerkt, da steht ja noch einiges :) Ich glaube vom WMI Generator lass ich aber erstmal die Finger, sieht total umfangreich aus. Ich möchte eigentlich nur prüfen, ob die aktuellste zeile einen fehler enthält. Also wenn eine Zeile dazukommt, das Programm diese ausließt, sich "anschaut" z.B. den Code und dann eben diesen weiterverarbeitet (wenn da zum beispiel kommt, Code 21, Update nicht erfolgreich). Dazu scheint mir der Inhalt der Seite erstmal zu reichen.

jaenicke 10. Jun 2013 21:24

AW: EventLog speichern/in Anwendung importieren
 
Events lesen geht viel einfacher über die entsprechende EventLogging API, z.B. mit ReadEventLog:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Luckie 10. Jun 2013 22:35

AW: EventLog speichern/in Anwendung importieren
 
Eventuell hilft dir der EventLogLister von Assarbad weiter: http://assarbad.net/en/stuff


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz