2009-03-03 11 views
3

Ich habe Code, der das Windows-Ereignisprotokoll liest. Es verwendet OpenEventLog, ReadEventLog und ruft die Ereignisquelle und die Ereignis-ID ab. Dann sieht er die Quelle unter derWie liest man das Windows Event Log ohne EventMessageFile?

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application 

Taste nach oben, lädt das entsprechende DLL (n) nach dem, was in EventMessageFile aufgeführt wird und schließlich verwendet FormatMessage die Ereigniszeichenfolgen mit dem DLL-Meldungs ​​Inhalt fusionieren das endgültige Ereignis zu bekommen Nachrichtentext. Dies ist der empfohlene Weg, und obwohl ein bisschen Schmerz, funktioniert es großartig.

Bis ... ich gehe die Quelle suchen und finde, dass es keinen EventMessageFile, sondern einen ProvideGuid Eintrag hat. Dies scheint der neue Weg zu sein (sie erscheinen auf Vista und Windows 2008). Uggh - nichts Format passieren für den Nachrichtentext suchen und Zusammenführung in den Datenstrings

:(

Suche in der Registrierung für die GUID Verweise auf andere Dateien führt (http.sys im Fall der HTTP-Quelle), aber ich kann nie den vollständigen Nachrichtentext bekommen.Muss ich diese EvtOpenSession APIs verwenden? Ich hoffe nicht, da ich bereits die EVENTLOGRECORD* von einem Anruf zu ReadEventLog habe, und die Tatsache, dass die Software benötigt Wird unter Windows 2003 ausgeführt, wobei EvtOpenSession nicht unterstützt wird (nur unter Vista und Windows 2008 verfügbar) HINWEIS: Einige Quellen unter Vista haben ProviderGUID und andere haben EventMessageFile, so dass die alte Methode immer noch praktikabel ist

Also was ich nachher bin, ist eine Möglichkeit, die ProviderGuid zu betrachten und die DLL, die an FormatMessage für die Anzeige der vollständigen Ereignisprotokoll Nachricht Text übergeben werden muss.

Vielen Dank für jede Eingabe

Antwort

1

Die APIs, auf die Richard verweist, sind für das neue Eventing-System (mit dem Codenamen Crimson, manchmal auch Manifest Based Providers genannt), das in Vista/Server 2K8 eingeführt wurde. Eines der Artefakte dieses neuen Systems sind neue APIs, um diese Protokolle zu verwenden, ein anderes ist der ProviderGuid-Schlüssel für bestimmte EventSources, die Ereignisse mit diesem neuen Framework erzeugen.

Ich denke, Sie sollten die Funktionen auf Windows Vista später verwenden, um diese Protokolle zu konsumieren, sollte es die Arbeit für Sie erledigen. Sie können die EvtFormatMessage-Methode zum Formatieren der Zeichenfolgen verwenden. Ich glaube, dass diese APIs auch die Ereignisse "klassischer" Anbieter lesen werden.

Wenn Sie diese Nachrichten von einer .NET-Anwendung verwenden, können Sie Typen im Namespace System.Diagnostics.Eventing.Reader verwenden, der in .NET 3.5 eingeführt wurde.

+0

Bedeutet das, dass eine App (der Windows Event Log Viewer zum Beispiel), die auf einem Win2003-Rechner läuft, die Ereignisse von einem Vista-Rechner nicht lesen kann das verwendet einen neuen Anbieter? – DougN

1

Es gibt Win32-APIs zum Lesen/Ereignisprotokolleinträge zu erweitern.

Siehe MSDN: http://msdn.microsoft.com/en-us/library/aa385780(VS.85).aspx

Alles andere, und Sie werden wahrscheinlich Probleme mit Patches zu finden, geschweige denn Service Packs oder neue Versionen lassen.

+0

Leider funktionieren diese APIs nur auf Vista und Windows Server 2008 :( – DougN

+0

Kann die falsche Verbindung haben. APIs existieren, um das Ereignisprotokoll auch in früheren Versionen von Windows zu lesen. (Vista/Win2k8 hat die erste Überarbeitung der Ereignisprotokollierung System seit WinNT3.1). – Richard

+0

Richtig. Und diese APIs sind, was ich verwende (OpenEventLog, ReadEventLog, etc.). Sie nehmen jedoch an, dass Sie die Nachrichtendatei der Ereignisquelle laden können, um FormatMessage aufzurufen.Wenn Sie die Datei nicht finden können, können Sie die vollständige Ereignismeldung nicht erhalten :( – DougN