begin
typ.Add('
Kopfzeile');
view:= '
Typ;Datum;Uhrzeit;Quelle;Kategorie;EventID;Benutzer;Computer;Nachricht';
// Kopfzeile festlegen
liste.Add(view);
// Kopfzeile speichern
event:= OpenEventLog(
nil, event_log_name);
// Eventlog öffnen
IF event = 0
THEN
Application.MessageBox('
EventLog konnte nicht geöffnet werden!', '
Fehler', 0)
// Ausgabe einer Fehlermeldung
ELSE
BEGIN
GetNumberOfEventLogRecords(event, gesamt_anzahl);
// Anzahl der Logs ermitteln
if gesamt_anzahl > 0
then
BEGIN
if anzahl > 0
// nicht alle Datensätze auswerten
then
alt_zahl:= gesamt_anzahl - (anzahl - 1)
// Anzahl der zu lesenden Logs auswerten
else
GetOldestEventLogRecord(event, alt_zahl);
// Ältesten Log ermitteln (wenn alle Einträge ermittelt werden sollen
for counter:= gesamt_anzahl
DOWNTO alt_zahl
DO // Anzahl vorhandener EventLogs
BEGIN
realbuffsize:= 4096;
getmem(pbuf, realbuffsize);
ReadEventLog(event, 6, counter, pbuf, realbuffsize,
read, read_next);
// Nächstes Event_log wird ausgelesen;
CASE pbuf^.EventType
OF // EventTyp lesbar speichern
EVENTLOG_ERROR_TYPE:
BEGIN
viewable.EventType:= '
Error';
typ.Add('
1');
END;
EVENTLOG_WARNING_TYPE:
BEGIN
viewable.EventType:= '
Warning';
typ.Add('
2');
END;
EVENTLOG_INFORMATION_TYPE:
BEGIN
viewable.EventType:= '
Information';
typ.Add('
3');
END;
EVENTLOG_AUDIT_SUCCESS:
BEGIN
viewable.EventType:= '
Success Audit';
typ.Add('
4');
END;
EVENTLOG_AUDIT_FAILURE:
BEGIN
viewable.EventType:= '
Failure Audit';
typ.Add('
5');
END;
END;
source := next_pointer_step(pbuf, sizeof(pbuf^));
// Pointer auf den SourceNamen setzen
SetString(viewable.SourceName, source, lstrlen(source));
// SourceNamen abspeichern
inc(source, lstrlen(source) + 1);
// Pointer auf den Computernamen setzen
SetString(viewable.ComputerName, source, lstrlen(source));
// Computernamen speichern
// Zeit ermitteln
viewable.LocalTimeGenerated:= UnixTimetoFiletime(pbuf^.TimeGenerated);
// Zeit, Datum auslesen und anschließend konvertieren
FileTimeToLocalFileTime(viewable.localtimeGenerated, viewable.LocalTimeGenerated);
FileTimeToSystemTime(viewable.localtimeGenerated, zeit);
// Ist in dem Datensatz eine SID vorhanden
if pbuf^.UserSidLength <> 0
then
// Wenn ja, dann Namen raussuchen
BEGIN
LookUpAccountSid(source, next_pointer_step(pbuf, pbuf^.UserSidOffset), usrName, usrSize, domainName, domainSize, peuse);
viewable.Username:= usrName;
if not (viewable.Username = '
')
then // entsprechend speichern
viewable.UserName := Format('
%s', [usrName])
else
viewable.UserName:= '
N/A';
END
else
viewable.UserName:= '
N/A';
// Username entweder vorhanden oder auf 'N/A' gesetzt
error := RegOpenKeyEx(HKEY_LOCAL_MACHINE, PChar('
SYSTEM\CurrentControlSet\Services\Eventlog\'+event_log_name+'
\'+viewable.sourcename), 0, KEY_ALL_ACCESS, regkey);
// Registrierung öffnen
if error = ERROR_SUCCESS
THEN
BEGIN // Schlüssel in der Registrierung vorhanden
h1:=
nil;
regbuffersize:= 1024;
GetMem(h1, 1024);
error:= RegQueryValueEx(regkey, '
EventMessageFile',
nil,
nil, PByte(h1), @regbuffersize);
// Schlüssel auslesen
if error = ERROR_SUCCESS
THEN
BEGIN // Zugehörigen DLL-Namen speichern & Nachrichtentext ermitteln
SetString(viewable.SourceFile, PChar(h1), lstrlen(PChar(h1)));
freemem(h1);
viewable.MessageText:= geteventmessagetext(pbuf^.EventID, viewable.sourcefile, pbuf, viewable);
// Nachrichtentext ins lesbare konvertieren
view:=viewable.EventType+'
;'+Format('
%2.2d/%2.2d/%4.4d', [zeit.wMonth, zeit.wDay, zeit.wYear])+'
;'+Format('
%2.2d:%2.2d:%2.2d', [zeit.wHour, zeit.wMinute, zeit.wSecond])+'
;'+viewable.SourceName+'
;';
// Logstring anlegen
if viewable.EventCategory = '
'
then viewable.EventCategory:= '
None';
view:= view+viewable.EventCategory+'
;'+inttostr(pbuf^.EventID)+'
;'+viewable.Username+'
;'+viewable.ComputerName+'
;'+viewable.MessageText+'
;';
liste.Add(view);
// Logstring der Liste hinzufügen
END // Zugehörigen DLL-Namen speichern & Nachrichtentext ermitteln
ELSE
BEGIN // Keine DLL-Datei in der Registry eingetragen
view:=viewable.EventType+'
;'+Format('
%2.2d/%2.2d/%4.4d', [zeit.wMonth, zeit.wDay, zeit.wYear])+'
;'+Format('
%2.2d:%2.2d:%2.2d', [zeit.wHour, zeit.wMinute, zeit.wSecond])+'
;'+viewable.SourceName+'
;';
// Logstring anlegen
if viewable.EventCategory = '
'
then viewable.EventCategory:= '
None';
hw:= next_pointer_step(pbuf, pbuf^.Stringoffset);
viewable.MessageText:= '
KEINE DLL-DATEI VORHANDEN: ';
if pbuf^.Numstrings < 1
then view:= '
Nicht erkennbare Daten'
else
BEGIN
for j:=1
to pbuf^.Numstrings
DO // Parameter im Nachrichtentext ersetzen
BEGIN
SetString(hs, hw, lstrlen(hw));
inc (hw, lstrlen(hw)+1);
viewable.MessageText:= viewable.MessageText+hs;
END;
view:= view+viewable.EventCategory+'
;'+inttostr(pbuf^.EventID)+'
;'+viewable.Username+'
;'+viewable.ComputerName+'
;'+viewable.MessageText+'
;';
END;
liste.Add(view);
// Logstring der Liste hinzufügen
Freemem(hw);
END;
RegCloseKey(regkey);
END // Schlüssel in der Registrierung vorhanden
ELSE // Kein Eintrag in der Registrierung vorhanden
BEGIN // Keine DLL-Datei in der Registry eingetragen
view:=viewable.EventType+'
;'+Format('
%2.2d/%2.2d/%4.4d', [zeit.wMonth, zeit.wDay, zeit.wYear])+'
;'+Format('
%2.2d:%2.2d:%2.2d', [zeit.wHour, zeit.wMinute, zeit.wSecond])+'
;'+viewable.SourceName+'
;';
// Logstring anlegen
if viewable.EventCategory = '
'
then viewable.EventCategory:= '
None';
hw:= next_pointer_step(pbuf, pbuf^.Stringoffset);
viewable.MessageText:= '
KEINE DLL-DATEI VORHANDEN: ';
if pbuf^.Numstrings < 1
then view:= '
Nicht erkennbare Daten'
else
BEGIN
for j:=1
to pbuf^.Numstrings
DO // Parameter im Nachrichtentext ersetzen
BEGIN
SetString(hs, hw, lstrlen(hw));
inc (hw, lstrlen(hw)+1);
viewable.MessageText:= viewable.MessageText+hs;
END;
view:= view+viewable.EventCategory+'
;'+inttostr(pbuf^.EventID)+'
;'+viewable.Username+'
;'+viewable.ComputerName+'
;'+viewable.MessageText+'
;';
END;
liste.Add(view);
// Logstring der Liste hinzufügen
Freemem(hw);
END;
Freemem(pbuf);
END;
// FOR-Schleife
END;
END;
CloseEventLog(event);
end;