![]() |
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 |
AW: EventLog speichern/in Anwendung importieren
Hier gab es einen Beitrag dazu
![]() |
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; |
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:
VarArrayLowBound verlangt den 2. Parameter "Dim" vom Typ Integer. Bin ich ehrlich gesgat etwas aufgeschmissen, weil ich nicht weiß, was DIM/Dim bedeutet :(
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; [EDIT]: Habe gearde was von der Jedi Komponente TJvNetEventLog erfahren. Die werde ich mir auch nochmal genauer anschauen :) |
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; |
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:
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 :(
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; |
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. |
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.
|
AW: EventLog speichern/in Anwendung importieren
Events lesen geht viel einfacher über die entsprechende EventLogging API, z.B. mit ReadEventLog:
![]() |
AW: EventLog speichern/in Anwendung importieren
Eventuell hilft dir der EventLogLister von Assarbad weiter:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz