Makale Özeti

Bilgisayarımızda kullandığımız uygulamalar çalışırken herhangi bir hata, uyarı ve bilgilendirme durumunda event log'a kayıt atarlar. Biz kullanıcılar da uygulamaların çalışma durumları ile ilgili bilgi almak, herhangi bir sorunla karşılaşıldığında nedenini öğrenmek iiçn event log'a bakarız. .Net Framework 3.5 çıkana kadar event log'a uygulamalarımız üzerinden System.Diagnostics.EventLog namespace'ini kullanarak kayıt da yapabiliyorduk. .Net FW 3.5 ile artık sadece event log'a kayıt yazma işlemi değil, aynı zamanda yazılmış olan kayıtları okuma işlemini de yapabiliyoruz. Tabii bunun için öncelikle event log'unu okuyacağımız makinanın Windows Vista, Windows Server 2008 ve Windows 7 işletim sisteminde çalışıyor olması gerekiyor.

Makale

Bilgisayarımızda kullandığımız uygulamalar çalışırken herhangi bir hata, uyarı ve bilgilendirme durumunda event log'a kayıt atarlar. Biz kullanıcılar da uygulamaların çalışma durumları ile ilgili bilgi almak, herhangi bir sorunla karşılaşıldığında nedenini öğrenmek iiçn event log'a bakarız. .Net Framework 3.5 çıkana kadar event log'a uygulamalarımız üzerinden System.Diagnostics.EventLog namespace'ini kullanarak kayıt da yapabiliyorduk. .Net FW 3.5 ile artık sadece event log'a kayıt yazma işlemi değil, aynı zamanda yazılmış olan kayıtları okuma işlemini de yapabiliyoruz. Tabii bunun için öncelikle event log'unu okuyacağımız makinanın Windows Vista, Windows Server 2008 ve Windows 7 işletim sisteminde çalışıyor olması gerekiyor.

Ben bu makalemde .Net framework ile uygulamalarımızda event log kayıtlarını nasıl okuyabileceğimiz hakkında bilgi vereceğim.System.Diagnostics.Eventing.Reader namespace'i ile uygulamanın çalıştığı lokal makinadaki event log kayıtlarını okuyabiliriz. Aynı zamanda bir dosyaya kaydedilmiş olan event log kayıtlarını da okuyabiliriz. Son olarak uzaktaki bir makinaya bağlanıp, makinanın event log'unu da sorgulayabiliriz.

İlk olarak lokal makinadaki event log'dan kayıtları okumak için gerekli kodu yazalım.

System.Diagnostics.Eventing.Reader namespace'ini using ifadesi olarak koda ekleyelim:

 using System.Diagnostics.Eventing.Reader;

Ardından da konsol uygulamamıza aşağıdaki kodu yazalım:

static void Main(string[] args)
{
    myEventLogConsole.Program p = new Program();
    p.QueryEventLog();
}

public void QueryEventLog()
{
    EventLogQuery
elq = new EventLogQuery("Application", PathType.LogName, "*[System/Level=3]");
    EventLogReader
elr = new EventLogReader(elq);
    while
(elr.ReadEvent() != null)
    {
        EventRecord
insEventRecord = elr.ReadEvent();
        Console
.WriteLine("-----------------------------------------------------");
        Console
.WriteLine("ID: {0}", insEventRecord.Id);
        Console
.WriteLine("Publisher: {0}", insEventRecord.ProviderName);
        Console
.WriteLine("Description: {0}", insEventRecord.FormatDescription());
        Console
.WriteLine("Machine Name: {0}", insEventRecord.MachineName);
        Console
.WriteLine("Time Created: {0}", insEventRecord.TimeCreated);
    }
}

Görüldüğü gibi event log'u sorgulamak için Xpath sorgusu yazmak gerekiyor (Örnekte çok basit bir sorgu yazdım, ancak isterseniz daha detaylı event log sorguları oluşturma ile ilgili bilgiye http://msdn.microsoft.com/en-us/library/bb399427.aspx adresinden ulaşabilirsiniz). Ardından da EventLogQuery, EventLogReader, EventRecord nesnelerini kullanarak bilgisayarın event log'unda ihtiyacımız olan bilgileri alabiliyoruz.

Bir dosya olarak kaydedilmiş olan event log kayıtlarını da aşağıdaki gibi okuyabiliriz:

public void QueryEventLogFile()
{
    EventLogQuery
elq = new EventLogQuery(@"C:\events.evtx", PathType.FilePath, "*[System/Level=3]");
    EventLogReader
elr = new EventLogReader(elq);
    while
(elr.ReadEvent() != null)
    {
        EventRecord
insEventRecord = elr.ReadEvent();
        Console
.WriteLine("-----------------------------------------------------");
        Console
.WriteLine("ID: {0}", insEventRecord.Id);
        Console
.WriteLine("Publisher: {0}", insEventRecord.ProviderName);
        Console
.WriteLine("Description: {0}", insEventRecord.FormatDescription());
        Console
.WriteLine("Machine Name: {0}", insEventRecord.MachineName);
        Console
.WriteLine("Time Created: {0}", insEventRecord.TimeCreated);
    
}
}

Örnekte görüldüğü gibi bir dosyaya kaydedilmiş olan event log kayıtlarını okumak için EventLogQuery nesnesinin instance'ını alırken constructor'una parametre olarak geçirdiğimiz değerler değişiyor. İlk parametre olarak dosya yolunu, ardından PathType enum'unun da FilePath öğesini geçiriyoruz. Son olarak biraz önce de yaptığımız gibi sorgu string'ini parametre geçiriyoruz. Ardından yaptığımız işlemler biraz önceki işlemlerle aynı.

Son olarak da uzaktaki bir makinadaki event log'u nasıl sorgulayabileceğimizi görelim:

 public void QueryRemoteMachine()
{
    SecureString
ss = GetPassword();
    EventLogSession
els = new EventLogSession("RemoteComputerName", "Domain", "Username", ss, SessionAuthentication.Default);
    EventLogQuery
elq = new EventLogQuery("Application", PathType.LogName, "*[System/Level=3]");
    elq.Session = els;
    EventLogReader
elr = new EventLogReader(elq);
    while
(elr.ReadEvent() != null)
    {
        EventRecord
insEventRecord = elr.ReadEvent();
        Console
.WriteLine("-----------------------------------------------------");
        Console
.WriteLine("ID: {0}", insEventRecord.Id);
        Console
.WriteLine("Publisher: {0}", insEventRecord.ProviderName);
        Console
.WriteLine("Description: {0}", insEventRecord.FormatDescription());
        Console
.WriteLine("Machine Name: {0}", insEventRecord.MachineName);
        Console.WriteLine("Time Created: {0}", insEventRecord.TimeCreated);
    }
}

public static SecureString GetPassword()
{
    SecureString
password = new SecureString();
    Console
.WriteLine("Enter 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);
                Console
.Write(nextKey.KeyChar);
                Console
.Write(" ");
                Console
.Write(nextKey.KeyChar);
            }
        }
        else
       
{
            password.AppendChar(nextKey.KeyChar);
            Console
.Write("*");
        }
    nextKey = Console.ReadKey(true);
    }
    Console
.WriteLine();
    password.MakeReadOnly();
    return password;
}

Uzaktaki bir makinayı sorgularken EventLogSession nesnesini kullanıyoruz. Bu nesnenin instance'ını alırken farklı bir constructor kullanarak parametrelerine uzaktaki bir makinaya bağlanırken hangi bilgileri giriyorsak, o bilgileri geçiriyoruz. Makina adı, domain'i, kullanıcı adı ve şifresi. Şifreyi SecureString olarak geçirmemiz gerektiği için de GetPassword metodunu yazdık. Instance aldıktan sonra yapmamız gereken tek şey EventLogQuery nesnesinin Session property'sine EventLogSession nesnesini atamak. Ardından yaptığımız işlemler diğer event log okuma işlemleri ile aynı olacak.

Görüldüğü gibi bir makinadaki event log'u okumak .Net framework 3.5 ile gelen yeni class'lar sayesinde çok kolay. Umarım faydalı olmuştur.

Kaynak: http://msdn.microsoft.com/en-us/library/bb671200.aspx

Işıl Orhanel

www.isilorhanel.net