Condividi tramite


Procedura: eseguire query per eventi

È possibile eseguire una query per ottenere un gruppo di eventi che corrispondono a determinati criteri di query per filtrare gli eventi archiviati in un registro eventi. La query consente di filtrare gli eventi in base alle proprietà evento. È possibile, ad esempio, eseguire una query per ottenere tutti gli eventi di livello 2 di un determinato registro eventi che si sono verificati in uno specifico periodo di tempo, oppure una query per tutti gli eventi con identificatore 105.

Esempio

Descrizione

Nell'esempio di codice riportato di seguito vengono utilizzate le classi di System.Diagnostics.Eventing.Reader per eseguire una query per ottenere tutti gli eventi di livello 2 del registro eventi dell'applicazione. Per ciascun evento restituito dalla query vengono visualizzati la descrizione, l'ID evento e il nome dell'autore evento. Nell'esempio di codice riportato di seguito viene illustrato come eseguire una query per ottenere gli eventi di un registro eventi attivo, di un registro eventi esterno e di un computer remoto. Ogni metodo di questo esempio di codice segue una serie di passaggi per eseguire la query.

  1. Creare un'istanza della classe EventLogQuery specificando una stringa di query utilizzata per filtrare eventi e il nome oppure il percorso del registro eventi per il quale eseguire la query. Per eseguire la query in un registro eventi esterno, specificare il percorso del file di log (evtx). Per ulteriori informazioni su come individuare i nomi dei registri eventi, vedere l'esempio di codice in Procedura: configurare e leggere le proprietà del registro eventi oppure cercare i registri eventi nello strumento Visualizzatore eventi. Per ulteriori informazioni su come creare una stringa di query eventi, vedere Query eventi e XML eventi.

  2. (Facoltativo) Per eseguire una query per ottenere gli eventi di un computer remoto, impostare la proprietà Session su un'istanza della classe EventLogSession e specificare il nome del computer remoto, il dominio nonché il nome utente e la password utilizzati per la connessione al computer remoto.

  3. Creare un'istanza della classe EventLogReader specificando l'istanza di EventLogQuery creata al passaggio 1.

  4. Per ottenere i risultati della query, utilizzare le istanze di EventRecord restituite dal metodo ReadEvent. Nei risultati della query, ogni istanza restituita contiene le informazioni evento relative a un evento. Per ulteriori informazioni sulla lettura di informazioni evento dall'istanza di un evento, vedere Procedura: accedere e leggere le informazioni eventi.

Codice

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;
        }
    }
}

Compilazione del codice

Nell'esempio di codice riportato di seguito vengono richiesti riferimenti ai file System.dll, System.Security.dll e System.Core.dll.

Vedere anche

Concetti

Scenari di registri eventi
Procedura: sottoscrivere gli eventi in un registro eventi

Footer image

Invia commenti su questo argomento a Microsoft.

Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.