Verfahrensweise: Abfragen von Ereignissen
Sie können eine Gruppe von Ereignissen abfragen, die einem bestimmten Abfragekriterium entsprechen, um die in einem Ereignisprotokoll gespeicherten Ereignisse zu filtern. Die Abfrage filtert Ereignisse auf Grundlage von Ereigniseigenschaften. So können Sie beispielsweise alle Ereignisse der 2. Stufe in einem bestimmten Ereignisprotokoll abfragen, die innerhalb eines bestimmten Zeitraums aufgetreten sind, oder Sie können alle Ereignisse mit einem Bezeichner abfragen, der "105" entspricht.
Beispiel
Beschreibung
Im folgenden Codebeispiel werden mithilfe der System.Diagnostics.Eventing.Reader-Klassen alle Ereignisse der 2. Stufe im Anwendungsereignisprotokoll abgefragt. Für jedes von der Abfrage zurückgegebene Ereignis werden die Beschreibung, die Ereignis-ID und der Name des Ereignisherausgebers angezeigt. Das Codebeispiel zeigt, wie Ereignisse aus einem aktiven und einem externen Ereignisprotokoll abgefragt werden, sowie die Abfrage von einem Remotecomputer aus. Jedes in diesem Codebeispiel verwendete Verfahren durchläuft eine Abfolge von Schritten, um Ereignisse abzufragen.
Erstellen Sie eine Instanz der EventLogQuery-Klasse, indem Sie eine Abfragezeichenfolge angeben, mit der Ereignisse gefiltert werden, sowie den Namen oder Speicherort des abzufragenden Ereignisprotokolls. Geben Sie zum Abfragen eines externen Ereignisprotokolls den Pfad zu der Protokolldatei (EVTX) an. Weitere Informationen zum Auffinden von Ereignisprotokollnamen finden Sie im Codebeispiel unter Verfahrensweise: Konfigurieren und Lesen von Ereignisprotokolleigenschaften, oder indem Sie in der Ereignisanzeige nach Ereignisprotokollen suchen. Weitere Informationen zum Erstellen einer Abfragezeichenfolge für Ereignisse finden Sie unter Ereignisabfragen und Ereignis-XML-Code.
(Optional) Legen Sie zum Abfragen von Ereignissen von einem Remotecomputer aus die Session-Eigenschaft auf eine Instanz der EventLogSession-Klasse fest, und geben Sie den Remotecomputernamen, dessen Domäne und den Benutzernamen mit Kennwort an, mit denen eine Verbindung mit dem Remotecomputer hergestellt wird.
Erstellen Sie eine Instanz der EventLogReader-Klasse, indem Sie die in Schritt 1 erstellte EventLogQuery-Instanz angeben.
Um die Abfrageergebnisse abzurufen, verwenden Sie die von der ReadEvent-Methode zurückgegebenen EventRecord-Instanzen. Jede zurückgegebene Ereignisinstanz enthält Ereignisinformationen zu einem Ereignis aus den Abfrageergebnissen. Weitere Informationen zum Lesen der Ereignisinformationen aus einer Ereignisinstanz finden Sie unter Verfahrensweise: Zugreifen auf und Lesen von Ereignisinformationen.
Imports System
Imports System.Diagnostics.Eventing.Reader
Imports System.Security
Public Class EventQueryExample
Public Overloads Shared Function Main( _
ByVal args() As String) As Integer
Dim ex As New EventQueryExample()
ex.QueryActiveLog()
ex.QueryExternalFile()
ex.QueryRemoteComputer()
End Function
Public Sub QueryActiveLog()
Dim queryString As String = "*[System/Level=2]" ' XPATH Query
Dim eventsQuery As New EventLogQuery("Application", PathType.LogName, queryString)
Dim logReader As New EventLogReader(eventsQuery)
Dim eventInstance As EventRecord = logReader.ReadEvent()
While Not eventInstance Is Nothing
' Display event info
Console.WriteLine("-----------------------------------------------------")
Console.WriteLine("Event ID: {0}", eventInstance.Id)
Console.WriteLine("Publisher: {0}", eventInstance.ProviderName)
Console.WriteLine("Description: {0}", eventInstance.FormatDescription())
eventInstance = logReader.ReadEvent()
End While
End Sub
Public Sub QueryExternalFile()
Dim queryString As String = "*[System/Level=2]" ' XPATH Query
Dim eventLogLocation As String = "C:\MyEvents.evtx"
Dim eventsQuery As New EventLogQuery(eventLogLocation, PathType.FilePath, queryString)
Try
Dim logReader As New EventLogReader(eventsQuery)
Dim eventInstance As EventRecord = logReader.ReadEvent()
While Not eventInstance Is Nothing
' Display event info
Console.WriteLine("-----------------------------------------------------")
Console.WriteLine("Event ID: {0}", eventInstance.Id)
Console.WriteLine("Publisher: {0}", eventInstance.ProviderName)
Console.WriteLine("Description: {0}", eventInstance.FormatDescription())
eventInstance = logReader.ReadEvent()
End While
Catch e As EventLogNotFoundException
Console.WriteLine("Could not find the external log to query! " & e.Message)
Return
End Try
End Sub
Public Sub QueryRemoteComputer()
Dim queryString As String = "*[System/Level=2]" ' XPATH Query
Dim pw As SecureString = GetPassword()
Dim session As EventLogSession = New EventLogSession( _
"RemoteComputerName", _
"Domain", _
"Username", _
pw, _
SessionAuthentication.Default)
pw.Dispose()
' Query the Application log on the remote computer.
Dim query As EventLogQuery = New EventLogQuery( _
"Application", PathType.LogName, queryString)
query.Session = session
Try
Dim reader As New EventLogReader(query)
Dim instance As EventRecord = reader.ReadEvent()
While Not instance Is Nothing
Console.WriteLine("------------------------------")
Console.WriteLine("Event ID: {0}", instance.Id)
Console.WriteLine("Description: {0}", instance.FormatDescription())
instance = reader.ReadEvent()
End While
Catch e As EventLogException
Console.WriteLine("Could not query the remote computer! " & e.Message)
Return
End Try
End Sub
' <summary>
' Read a password from the console into a SecureString
' </summary>
' <returns>Password stored in a secure string</returns>
Public Function GetPassword() As SecureString
Dim password As New SecureString()
Console.WriteLine("Enter password: ")
' get the first character of the password
Dim nextKey As ConsoleKeyInfo = Console.ReadKey(True)
While nextKey.Key <> ConsoleKey.Enter
If nextKey.Key = ConsoleKey.Backspace Then
If password.Length > 0 Then
password.RemoveAt(password.Length - 1)
' erase the last * as well
Console.Write(nextKey.KeyChar)
Console.Write(" ")
Console.Write(nextKey.KeyChar)
End If
Else
password.AppendChar(nextKey.KeyChar)
Console.Write("*")
End If
nextKey = Console.ReadKey(True)
End While
Console.WriteLine()
' lock the password down
password.MakeReadOnly()
Return password
End Function
End Class
using System;
using System.Diagnostics.Eventing.Reader;
using System.Security;
namespace EventQuery
{
class EventQueryExample
{
static void Main(string[] args)
{
EventQueryExample ex = new EventQueryExample();
ex.QueryActiveLog();
ex.QueryExternalFile();
ex.QueryRemoteComputer();
}
public void QueryActiveLog()
{
string queryString = "*[System/Level=2]"; // XPATH Query
EventLogQuery eventsQuery = new EventLogQuery("Application", PathType.LogName, queryString);
EventLogReader logReader = new EventLogReader(eventsQuery);
for (EventRecord eventInstance = logReader.ReadEvent();
null != eventInstance; eventInstance = logReader.ReadEvent())
{
// Display event info
Console.WriteLine("-----------------------------------------------------");
Console.WriteLine("Event ID: {0}", eventInstance.Id);
Console.WriteLine("Publisher: {0}", eventInstance.ProviderName);
Console.WriteLine("Description: {0}", eventInstance.FormatDescription());
}
}
public void QueryExternalFile()
{
string queryString = "*[System/Level=2]"; // XPATH Query
string eventLogLocation = @"C:\MyEvents.evtx";
EventLogQuery eventsQuery = new EventLogQuery(eventLogLocation, PathType.FilePath, queryString);
try
{
EventLogReader logReader = new EventLogReader(eventsQuery);
for (EventRecord eventInstance = logReader.ReadEvent();
null != eventInstance; eventInstance = logReader.ReadEvent())
{
// Display event info
Console.WriteLine("-----------------------------------------------------");
Console.WriteLine("Event ID: {0}", eventInstance.Id);
Console.WriteLine("Publisher: {0}", eventInstance.ProviderName);
Console.WriteLine("Description: {0}", eventInstance.FormatDescription());
}
}
catch (EventLogNotFoundException e)
{
Console.WriteLine("Could not find the external log to query! " + e.Message);
return;
}
}
public void QueryRemoteComputer()
{
string queryString = "*[System/Level=2]"; // XPATH Query
SecureString pw = GetPassword();
EventLogSession session = new EventLogSession(
"RemoteComputerName", // Remote Computer
"Domain", // Domain
"Username", // Username
pw,
SessionAuthentication.Default);
pw.Dispose();
// Query the Application log on the remote computer.
EventLogQuery query = new EventLogQuery("Application", PathType.LogName, queryString);
query.Session = session;
try
{
EventLogReader reader = new EventLogReader(query);
for (EventRecord instance = reader.ReadEvent(); instance != null; instance = reader.ReadEvent())
{
Console.WriteLine("------------------------------");
Console.WriteLine("Event ID: {0}", instance.Id);
Console.WriteLine("Description: {0}", instance.FormatDescription());
}
}
catch (EventLogException e)
{
Console.WriteLine("Could not query the remote computer! " + e.Message);
return;
}
}
/// <summary>
/// Read a password from the console into a SecureString
/// </summary>
/// <returns>Password stored in a secure string</returns>
public static SecureString GetPassword()
{
SecureString password = new SecureString();
Console.WriteLine("Enter password: ");
// get the first character of the password
ConsoleKeyInfo nextKey = Console.ReadKey(true);
while (nextKey.Key != ConsoleKey.Enter)
{
if (nextKey.Key == ConsoleKey.Backspace)
{
if (password.Length > 0)
{
password.RemoveAt(password.Length - 1);
// erase the last * as well
Console.Write(nextKey.KeyChar);
Console.Write(" ");
Console.Write(nextKey.KeyChar);
}
}
else
{
password.AppendChar(nextKey.KeyChar);
Console.Write("*");
}
nextKey = Console.ReadKey(true);
}
Console.WriteLine();
// lock the password down
password.MakeReadOnly();
return password;
}
}
}
Kompilieren des Codes
Für dieses Codebeispiel werden Verweise auf die Dateien System.dll, System.Security.dll und System.Core.dll benötigt.
Siehe auch
Konzepte
Ereignisprotokollszenarien
Verfahrensweise: Abonnieren von Ereignissen in einem Ereignisprotokoll
Senden Sie Kommentare zu diesem Thema an Microsoft.
Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.