Freigeben über


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.

  1. 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.

  2. (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.

  3. Erstellen Sie eine Instanz der EventLogReader-Klasse, indem Sie die in Schritt 1 erstellte EventLogQuery-Instanz angeben.

  4. 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

Footer image

Senden Sie Kommentare zu diesem Thema an Microsoft.

Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.