|
Eventlog auslesen und in lesbarer Form darstellen
Frage: Ich müsste etwas programmieren, das die Eventlogs von Windows ausliest (System, Security, Application) und in lesbarer Form darstellt. Codeschnipsel wären Klasse, aber einfach ein paar Hinweise oder Links würden mir sicherlich auch helfen, da ich noch überhaupt keine Ahnung habe, wie ich das machen soll.
Antwort: Am einfachsten geht das über WMI (Windows Management Instrumentation). WMI ist eine universelle Treiberschicht, die Informationen aus den unterschiedlichsten Bereichen (Hardware, Treiber, BIOS, Anwendungseinstellungen, Ereignisanzeige usw.) bereitstellen kann sowie auch Konfigurationszugriffe erlaubt, indem alle diese Detail-APIs verborgen und durch ein univerelles API ersetzt werden. Ein Anwendungsentwickler muss sich nur noch in ein API (WMI) einarbeiten, um die verschiedenen Aufgaben erfüllen zu können. WMI steht unter Windows 2000 sofort zur Verfügung, unter Windows 9x und Windows NT 4 jedoch nur als optionale Komponente.
WMI stellt mit WQL (WMI Query Language) eine eigene Abfragesprache zur Verfügung, die an SQL angelehnt ist. Um zum Beispiel das Eventslog Application auszulesen, könnte das so aussehen:
SELECT Type,SourceName,TimeGenerated,Message
FROM Win32_NTLogEvent
WHERE LogFile="Application"
WMI stellt ein Automation-Interface zur Verfügung, so dass Delphi direkt darauf zugreifen kann. Damit die Programmierhilfe von Delphi auch für die WMI-Interfaces zur Verfügung steht, wird zuerst die Typbibliothek Microsoft WMI Scripting V 1.x Library importiert. Delphi legt dabei auch auf Wunsch optional auch die VCL-Wrapperkomponenten für WMI an.
Das folgende Beispielprojekt für Delphi 7 liest das Eventslog Applicationaus, wobei nur nach einem bestimmten EventCode gesucht wird. Um das Beispiel in Delphi 5 kompilieren zu können, muss nur der Verweis auf die Units Variants und StrUtils entfernt werden:
unit BspWin32_NTLogEventFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ListView1: TListView;
StatusBar1: TStatusBar;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{ *.dfm}
uses ActiveX, WbemScripting_TLB, StrUtils;
procedure TForm1.Button1Click(Sender: TObject);
var
aLoc : ISWbemLocator;
aSrv : ISWbemServices;
aObjSet : ISWbemObjectSet;
pEnum : IEnumVARIANT;
vOut : OleVariant;
dwRetrieved : LongWord;
hRes : HResult;
sWQL : String;
aLI : TListItem;
begin
ListView1.Items.Clear;
aLoc := CoSWbemLocator.Create;
aSrv := aLoc.ConnectServer('','', '','','','',0, nil);
aSrv.Security_.ImpersonationLevel := wbemImpersonationLevelImpersonate;
aObjSet := aSrv.ExecQuery(Memo1.Text, 'WQL', 0, nil);
pEnum := aObjSet.Get__NewEnum as IEnumVARIANT;
while (TRUE) do
begin
hRes := pEnum.Next(1, vOut, dwRetrieved);
if hRes <> S_OK then
Break;
aLI := ListView1.Items.Add;
aLI.Caption := VarToStr(vOut.Type);
aLI.SubItems.Add(VarToStr(vOut.SourceName));
aLI.SubItems.Add(LeftStr(VarToStr(vOut.TimeGenerated), 8));
aLI.SubItems.Add(VarToStr(vOut.Message));
end;
end;
end.
Konfiguration im Objektinspektor:
object Form1: TForm1
Left = 308
Top = 115
Width = 836
Height = 334
Caption = 'Win32_NTLogEvent'
Color = clBtnFace
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -16
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 19
object Button1: TButton
Left = 8
Top = 256
Width = 75
Height = 25
Caption = 'Start'
TabOrder = 0
OnClick = Button1Click
end
object ListView1: TListView
Left = 0
Top = 73
Width = 826
Height = 177
Align = alTop
Columns = <
item
Caption = 'Typ'
Width = 150
end
item
Caption = 'Quelle'
Width = 100
end
item
Caption = 'Datum'
Width = 100
end
item
Caption = 'Beschreibung'
Width = 450
end>
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -15
Font.Name = 'Tahoma'
Font.Style = []
ParentFont = False
TabOrder = 1
ViewStyle = vsReport
end
object StatusBar1: TStatusBar
Left = 0
Top = 286
Width = 826
Height = 19
Panels = <>
SimplePanel = False
end
object Memo1: TMemo
Left = 0
Top = 0
Width = 826
Height = 73
Align = alTop
Lines.Strings = (
'SELECT Type,SourceName,TimeGenerated,Message '
'FROM Win32_NTLogEvent '
'WHERE LogFile="Application" AND EventCode="100"')
TabOrder = 3
end
end
|