URL dieses Artikels:

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

© 2002 Software & Support Verlag GmbH. Vervielfältigung nur mit Genehmigung des Verlags. Alle Markennamen sind in der Regel eingetragene Warenzeichen der entsprechenden Unternehmen oder Organisationen.
Fragen? ... zum Angebot des Software & Support Verlags: info@entwickler.com
... zu dieser Website: webmaster@entwickler.com