Das Ereignisprotokoll eingesehen oder mit der EventLog-Klasse programmatisch angesteuert werden. Die Dateien werden von einem Systemdienst verwaltet, den der Prozess Services aus der Dynamic Link Library Eventlog lädt.
Zu den protokollierten Ereignissen können beispielsweise fehlgeschlagene Anmeldeversuche, Statusänderungen der Netzwerkverbindungen, Warnungsmeldungen über die Systemsicherheit und Fehler bei der Einrichtung von Treibern oder beim Starten von Diensten gehören. Zu jedem Ereignis werden die Art des Ereignisses, die Ereignisquelle sowie Datum und Uhrzeit festgehalten. Als Ereignisquellen werden „Anwendung“ (Ereignisse innerhalb von Anwendungsprogrammen), „System“ (Ereignisse innerhalb des Betriebssystems) und „Sicherheit“ unterschieden.
Mitunter wird das Ereignisprotokoll von Support-Betrügern missbraucht, um gravierende Fehler vorzutäuschen.
Das folgende Beispiel zeigt, wie man das Protokoll ausliest und die einzelnen Ereignisse mit einem Keyword(DEC) leeren kann. Der Code liefert die Ereignisliste und den Keyword(DEC) Wert.
uses ExtCtrls, ActiveX, ComObj
procedure GetLogEvents;
const
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
FWbemObjectSet:= FWMIService.ExecQuery('SELECT Category,ComputerName,EventCode,Message,RecordNumber FROM Win32_NTLogEvent Where Logfile="System"','WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
while oEnum.Next(1, FWbemObject, iValue) = 0 do
begin
Form1.Memo1.Lines.Add(Format('Category %s',[String(FWbemObject.Category)]));
Form1.Memo1.Lines.Add(Format('Computer Name %s',[String(FWbemObject.ComputerName)]));
Form1.Memo1.Lines.Add(Format('EventCode %d',[Integer(FWbemObject.EventCode)]));
Form1.Memo1.Lines.Add(Format('Message %s',[String(FWbemObject.Message)]));
Form1.Memo1.Lines.Add(Format('RecordNumber %d',[Integer(FWbemObject.RecordNumber)]));
FWbemObject:=Unassigned;
end;
Screen.Cursor := crHourGlass;
end;
function PE_ClearEventLogNow(pEventLogKey: PChar):Integer;
var
hLog: THandle;
NumberOfRecords: DWord;
begin
Result := -1;
hLog := OpenEventLog(NIL, pEventLogKey);
if hLog <> INVALID_HANDLE_VALUE then
begin
GetNumberOfEventLogRecords(hLog, NumberOfRecords);
if not ClearEventLog(hLog, NIL) then
begin
CloseEventLog(hLog);
Exit;
end;
CloseEventLog(hLog);
Result := 0;
end;
end;
Protokolle auslesen :
procedure TForm1.Button1Click(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
try
CoInitialize(nil);
try
GetLogEvents;
finally
CoUninitialize;
end;
except
//on E:EOleException do
//ShowMessage(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
//on E:Exception do
//Writeln(E.Classname, ':', E.Message);
end;
//Writeln('Press Enter to exit');
//Readln;
end;
Ereigniss leeren :
procedure TForm1.Button2Click(Sender: TObject);
begin
PE_ClearEventLogNow(PChar(Edit1.Text));
end;
Keine Kommentare:
Kommentar veröffentlichen