Visual Studio ve Outlook interop’u sayesinde Outlook’ta kullandığımız nesnelere kendi yazdığımız uygulamalarımızdan da erişebiliyoruz. Bu sayede ister Outlook’a add-in yazma ister Outlook’dan veri alan veya Outlook’a veri gönderen Windows uygulaması yazma işi oldukça kolaylaşıyor. Yazgeliştir’deki bu makalemde Visual Studio ile C#’da Outlook Interop’u kullanarak Outlook’daki kontak bilgilerine erişme, yeni kontak ekleme, silme gibi işlemleri kendi uygulamalarımızda nasıl yapabileceğimizden bahsettim. Makaleyi okudukça ve kendiniz de örnek bir uygulama yazınca siz de göreceksiniz, makaledeki bilgilerle sadece kontak işlemleri değil, Outlook’da bulunan ve çoğumuzun kullandığı Appointment, Note, Task ve tabii ki Mail işlemlerini de yapabiliyoruz.

Visual Studio ve Outlook interop’u sayesinde Outlook’ta kullandığımız nesnelere kendi yazdığımız uygulamalarımızdan da erişebiliyoruz. Bu sayede ister Outlook’a add-in yazma ister Outlook’dan veri alan veya Outlook’a veri gönderen Windows uygulaması yazma işi oldukça kolaylaşıyor.

 

Ben bu makalemde Visual Studio ile C#’da Outlook Interop’u kullanarak Outlook’daki kontak bilgilerine erişme, yeni kontak ekleme, silme gibi işlemleri kendi uygulamalarımızda nasıl yapabileceğimizden bahsedeceğim. Makaleyi okudukça ve kendiniz de örnek bir uygulama yazınca siz de göreceksiniz, makaledeki bilgilerle sadece kontak işlemleri değil, Outlook’da bulunan ve çoğumuzun kullandığı Appointment, Note, Task ve tabii ki Mail işlemlerini de yapabiliyoruz.

 

Benim makalemde yazacağım örnek uygulama Outlook add-in’i değil, daha basit bir Windows uygulaması olacak. İlk olarak yeni bir proje oluşturalım ve Microsoft.Office.Interop.Outlook referansını projemize ekleyelim:

 

 

Ardından koda aşağıdaki using ifadesini yazalım:

 

using Microsoft.Office.Interop.Outlook;

 

Şimdi ilk iş Outlook’da yeni bir kontak ekleme işlemini yapalım. Formu aşağıdaki gibi dizayn edelim:

 

 

Bildiğiniz gibi Outlook’da bir kontağın oldukça fazla bilgisini tutabiliyoruz (yaklaşık 150 adet alan var). Biz uygulamamızda kontak kaydetme işlemini yaparken ad, soyad, e-mail adresi, görev, cinsiyet, doğumgünü, kategori, hobi, son ek, ünvan, tam ad, önem derecesi, resim bilgilerini kaydedeceğiz.

 

Formu dizayn edip koda geçtikten sonra ilk olarak uygulamamızda kullanacağımız üç nesneyi oluşturalım:

 

public Form1()
{

 

InitializeComponent();
}

 

Microsoft.Office.Interop.Outlook.Application insApplication = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.NameSpace insOutlookNameSpace;
Microsoft.Office.Interop.Outlook.MAPIFolder insContactsFolder;

 

private void Form1_Load(object sender, EventArgs e)
{
insOutlookNameSpace = insApplication.GetNamespace(“MAPI”);
insContactsFolder = insOutlookNameSpace.GetDefaultFolder(OlDefaultFolders.olFolderContacts);

 

cmbImportance.DataSource = Enum.GetValues(typeof(OlImportance));
cmbGender.DataSource = Enum.GetValues(typeof(OlGender));
}

 

Formda class level Application, NameSpace ve MAPIFolder nesnelerini tanımladık. Kontaklar ile ilgili işlemleri yapabilmek için NameSpace nesnesinin GelDefaultFolder metoduna Outlook folder’larından Contacts’ı parametre olarak geçiriyoruz. OlDefaultFolders enum’u Calendar, Inbox, Junk Mail, Deleted Items, Sent Items, Tasks, Outbox gibi Outlook folder’larını taşır. MAPI namespace nesnesini ise Application nesnesinin GetNamespace metoduna “MAPI” keyword’ünü geçirerek oluşturduk.

 

Formun load’ında yazdığımız son iki satır kodda ise Importance ve Gender combobox’larına OlImportance ve OlGender enum’larını datasource olarak verdik. Uygulamayı çalıştırdığımızda Importance combobox’ında Low, Normal ve High; Gender combobox’ında ise Unspecified, Female ve Male item’larını göreceğiz.

 

Şimdi de Insert New Outlook Contact butonunun click event’ine insert kodumuzu yazalım:

 

private void btnInsertContact_Click(object sender, EventArgs e)
{

 

ContactItem insContactItem = (Microsoft.Office.Interop.Outlook.ContactItem)insContactsFolder.Items.Add(Microsoft.Office.Interop.Outlook.OlItemType.olContactItem);

 

//ONEMLI!: veya asagidaki gibi Application nesnesinin CreateItem metodu da kullanilabilir:
//   ContactItem insContactItem = (ContactItem)insApplication.CreateItem(OlItemType.olContactItem);

 

insContactItem.FirstName = txtFirstName.Text;
insContactItem.LastName = txtLastName.Text;
insContactItem.JobTitle = txtJobTitle.Text;
insContactItem.Hobby = txtHobbies.Text;
insContactItem.FullName = txtFullName.Text; //Dikkat!! FullName veya FirstName LastName property’leri ayni anda set edilirse son atanan property’deki deger oncekini ezer. Bundan dolayi sadece FirstName, LastName veya FullName property’sinin set edilmesi gerekmektedir.
insContactItem.Gender = (OlGender)cmbGender.SelectedValue;
insContactItem.Suffix = txtSuffix.Text;
insContactItem.Email1Address = txtEmailAddress.Text;
insContactItem.Birthday = dateBirthday.Value;
insContactItem.Categories = txtCategories.Text;
insContactItem.Importance = (OlImportance)cmbImportance.SelectedValue;
if (txtPicture.Text != “”)
{
insContactItem.AddPicture(txtPicture.Text);
}
insContactItem.Save();
MessageBox.Show(“ok!”);
}

 

 

 

private void btnUploadPicture_Click(object sender, EventArgs e)
{
openFileDialog1.ShowDialog();
if (openFileDialog1.FileName != “”)
{
txtPicture.Text = openFileDialog1.FileName;
}
}

 

Kodda ilk olarak bir ContactItem nesnesi oluşturduk. Bu nesneyi oluştururken instance’ını aldığımız MAPIFolder nesnesinin (insContactsFolder) Items.Add metodunu kullandık. Fakat aynı işlemi instance’ını aldığımız Application nesnesinin (insApplication) CreateItem metodunu kullanarak da yapabilirdik.

 

ContactItem nesnesini oluşturduktan sonra formdaki alanları teker teker nesnenin property’lerine atadık. Kontağa resim eklemek içinse ContactItem nesnesinin AddPicture metodunu çağırdık ve parametre olarak resmin yolunu verdik. Son olarak da Save metodunu çağırdık. Şimdi uygulamayı çalıştırıp yeni bir kontak ekleyelim.

 

 

Kaydettikten sonra Outlook’ta contacts ekranında yeni eklediğimiz kontağımızı görebiliriz:

 

 

Şimdi de uygulama ekranındaki ikinci tab’da silme, listeleme gibi bazı işlemleri yapalım. Önce formu aşağıdaki gibi dizayn edelim:

 

 

Görüldüğü gibi bu ekranda kontakları listeleme, kopyalama, silme, kontak resmini silme, kontağı Business Card Editor’de gösterme ve Categories ekranını gösterme işlemlerini yapacağız. İlk olarak kontakları listview’de listeleyen butonun kodunu yazalım:

 

private void ListContacts()
{
lvContacts.Items.Clear();
foreach (ContactItem ci in insContactsFolder.Items)
{
lvContacts.Items.Add(new ListViewItem(ci.FullName));
}
}

 

void btnListContacts_Click(object sender, EventArgs e)
{
ListContacts();
}

 

Kodda görüldüğü gibi çok basit bir şeklide MAPIFolder nesnesinin instance’ınındaki (insContactsFolder) her ContactItem tipindeki item’ları döngü içinde listview kontrolüne ekledik.

 

Şimdi de sırayla kalan diğer butonların kodunu yazalım:

 

ContactItem GetSelectedContact(string parFullName)
{
ContactItem insContactItem = insContactsFolder.Items.OfType<ContactItem>().Where(i => i.FullName == parFullName).First();
return insContactItem;
}

 

private void btnCopyContact_Click(object sender, EventArgs e)
{
ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
insContactItem.Copy();
ListContacts();
}

 

private void btnDeleteContact_Click(object sender, EventArgs e)
{
ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
insContactItem.Delete();
ListContacts();
}

 

private void btnRemovePicture_Click(object sender, EventArgs e)
{
ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
if (insContactItem.HasPicture)
{
insContactItem.RemovePicture();
insContactItem.Save();
MessageBox.Show(“Picture removed”);
}
}

 

private void btnShowBusinessCardEditor_Click(object sender, EventArgs e)
{
ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
insContactItem.ShowBusinessCardEditor();
}

 

private void btnCategories_Click(object sender, EventArgs e)
{
ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
insContactItem.ShowCategoriesDialog();
}

 

Kalan işlemleri yapmak için listview’de seçili ContactItem’ı almak gerekiyor. Bunun için de GetSelectedContact fonksiyonunu yazdık. Listview’da seçili olan item’ın text’i kontağın FullName property’sindeki değer olduğu için insContactsFolder nesnesinin item’ları arasından FullName property’sinin değerine göre select işlemi yaptık ve fonksiyona ContactItem nesnesini döndürttük.

 

Ardından kopyalama işlemi için ContactItem nesnesinin Copy, silme işlemi için Delete, resmi silme işlemi için RemovePicture metodunu kullandık. Ancak önemli bir nokta: RemovePicture metodunu çağırdıktan sonra değişiklikleri kaydetmek için Save metodunu da çağırdık. Business Card Editor ekranını açmak için yine ContactItem nesnesinin ShowBusinessCardEditor metodunu çağırdık. Bu butona tıkladığımızda listview’de seçili kontak aşağıdaki gibi görüntülenecektir:

 

Son olarak da kontağın kategorilerini görüntülemek için ContactItem nesnesinin ShowCategoriesDialog metodunu çağırıyoruz. Bu butona tıkladığımızda da listview’de seçili kontağın kategorileri aşağıdaki gibi görüntülenecektir:

 

 

Son olarak bir kontağı nasıl update edebileceğimizi kısaca göstermek istiyorum:

 

void UpdateContact()
{
ContactItem insContactItem = GetSelectedContact(lvContacts.SelectedItems[0].Text);
insContactItem.FirstName = “Ad”;
insContactItem.LastName = “Soyad”;
//…
insContactItem.Save();
}

 

Görüldüğü gibi bir kontağı update etmek için ilgili kontağı bir ContactItem nesnesine atamanız ve güncellemek istediğiniz property’lerini set ettikten sonra Save metodunu çağırmanız yeterli olacaktır.

 

Not: Yapılan uygulama makalede anlatılanlara örnektir, bu yüzden herhangi bir validation veya hata yakalama işlemi için kod yazılmamıştır.

 

Işıl Orhanel
isil@isilorhanel.net

Merhabalar,

 

Geliştirdiğimiz uygulamalarda bilhassa son kullanıcının sürekli gördüğü User Interface arabiriminde gerek bilginin toplanması gerek ise bilginin gösterilmesi kullanıcının kullandığı dil bilgilerine uygun olmalıdır. Bu durum bilhassa multilanguage uygulamalarda çok önemli bir konuma gelmektedir. Örneğin İngiltere’deki bir kullanıcı ile Türkiye’de bulunan bir kullanıcı tarih biçimlerini ve ondalık ayraçlarını farklı şekilde görmelidir. Bu makalemde sizlere bu özelliği uygulamalarımıza nasıl kazandırabileceğimizi ve kullanıcının ayarlamış olduğu dil ayarlarını nasıl okuyabileceğimizi anlatacağım.

 

System.Globalization namespace’indeki class’lar bilgisayardaki dil, bölge, tarih & zaman, para birimi gibi bilgilerin ve bu bilgilerin formatlarının uygulamalarımızda yönetilmesini sağlayan class’lardır.

 

System.Globalization namespace’inin tüm öğelerinin detaylı açıklamalarına http://msdn.microsoft.com/en-us/library/system.globalization.aspx adresinden erişebilirsiniz. Bu makalemde System.Globalization namespace’inin önemli birkaç öğesinden bahsedeceğim. İlk olarak RegionInfo class’ından başlayalım. RegionInfo class’ı ülke ve bölge bilgilerini içerir ve bize kullanıcının bilgisayarındaki bölge ve dil seçeneklerinden bağımsız verileri sunar. ISO 3166′da bölge ve ülkeler için kabul edilmiş iki veya üç harfli kodları parametre alır. Örneğin Türkiye için geçerli bilgilere erişmek için RegionInfo class’ının instance’ını aşağıdaki gibi alırız:

 

System.Globalization.RegionInfo insRegionInfo = new System.Globalization.RegionInfo(“TR”);

 

Instance’ını aldığımız RegionInfo class’ının belli başlı property’leri aşağıda örnek kodda görülebilir:

 

static void Main(string[] args)
{

 

Program p = new Program();
p.GetRegionInfo();
Console.ReadKey();
}

 

void GetRegionInfo()
{
System.Globalization.RegionInfo insRegionInfo = new System.Globalization.RegionInfo(“TR”);

 

Console.WriteLine(“Bölge bilgileri:”);
Console.WriteLine(“Para birimi İngilizce adı: ” + insRegionInfo.CurrencyEnglishName);
Console.WriteLine(“Para birimi Türkçe adı: ” + insRegionInfo.CurrencyNativeName);
Console.WriteLine(“Para birimi simgesi: ” + insRegionInfo.CurrencySymbol);
Console.WriteLine(“Görüntülenen adı: ” + insRegionInfo.DisplayName);
Console.WriteLine(“İngilizce adı: ” + insRegionInfo.EnglishName);
Console.WriteLine(“Bölge Idsi: ” + insRegionInfo.GeoId);
Console.WriteLine(“Metrik sistem kullanılıyor mu: ” + insRegionInfo.IsMetric);
Console.WriteLine(“ISO döviz sembolü: ” + insRegionInfo.ISOCurrencySymbol);
Console.WriteLine(“Bölge adı: ” + insRegionInfo.Name);
Console.WriteLine(“Bölgenin yerel adı: ” + insRegionInfo.NativeName);
Console.WriteLine(“Bölgenin üç harfli ISO adı: ” + insRegionInfo.ThreeLetterISORegionName);
Console.WriteLine(“Bölgenin üç harfli Windows adı: ” + insRegionInfo.ThreeLetterWindowsRegionName);
Console.WriteLine(“Bölgenin iki harfli ISO adı: ” + insRegionInfo.TwoLetterISORegionName);

 

}

 

 

 

RegionInfo class’ından sonra bahsetmek istediğim iki class bulunuyor. Bunlar yine System.Globalization namespace’inin öğelerinden olan CultureInfo class’ının iki property’si CurrentCulture ve CurrentUICulture. CultureInfo class’ı belirli bir kültürün tarih & saat formatı,  haftanın ilk günü, ondalık simgesi, ölçü sistemi gibi belli başlı özelliklerini taşır. Hatta String class’ı dolaylı olarak CultureInfo class’ını kullanarak varsayılan kültür bilgisini alır.

 

Öncelikle bu class’ın iki öğesi CurrentCulture ve CurrentUICulture arasındaki farktan bahsetmek istiyorum.

 

Çoğu durumlarda CurrentCulture ve CurrentUICulture aynıdır. Bu property’ler kullanıcı bilgisayarına Multilangual Language Interface (MUI) yüklemişlerse ve bir yandan MUI’yi kullanıyorlarsa, ancak Bölge ve Dil seçeneklerinde MUI’nin ayarlarını değiştirmişlerse farklı olur. Culture ayarlarını değiştirmek istiyorsak kullanıcı arayüzü ayarlarını ve tarih/zaman ve sayı formatlarını farklılaştırmak durumunda kalırız. Culture ayarları Thread nesnesi ile ilişkilendirilirler ve CurrentCulture ve CurrentUICulture property’lerini tek bir thread’de aşağıdaki gibi set edebiliriz:

 

System.Globalization.CultureInfo insCultureInfo = new CultureInfo(“tr-TR”);

 

System.Threading.Thread.CurrentThread.CurrentCulture = insCultureInfo;

 

System.Threading.Thread.CurrentThread.CurrentUICulture = insCultureInfo;

 

 

 

CurrentCulture property’si tarih, zaman, sayı gibi değişkenlerin format ayarlarının yapılmasında, CurrentUICulture ise kullanıcı arayüzündeki dil seçiminde kullanılır.

 

Windows’ta kontrol panelde Bölge ve Dil seçenekleri ekranında yapılan değişiklikler CurrentCulture property’sini değiştirir.

 

 

CurrentUICulture bu ekranda yapılan değişikliklerden etkilenmez. CurrentUICulture işletim sisteminin çalıştığı dilin ayarları ile ilgilidir. Yani kullanıcıya gösterilen mesajlar, menü text’leri, yardım içeriği, tooltip’ler CurrentUICulture’dan etkilenir. Eğer Windows 7 (Ultimate, Enterprise), Vista veya XP çalışan bir makinada MUI kurulu ise Bölge ve Dil seçenekleri ekranında kullanıcı arayüzünün dili değiştirilebilir, bu da CurrentUICulture property’sini değiştirir.

 

 

Şimdi CurrentCulture ve CurrentUICulture ile ilgili anlattıklarımın ufak bir ispatını yapalım. Console uygulaması oluşturalım ve haftanın ilk gününü CurrentCulture ve CurrentUICulture property’lerinden okuyalım. Uygulama İngilizce Windows 7 işletim sisteminde çalışacak. İngilizce sistemlerde haftanın ilk günü pazardır, ancak benim Bölge ve Dil ayarları ekranında haftanın ilk günü pazartesi olarak ayarlanmış durumda:

 

 

Aşağıdaki kodu yazalım ve çalıştıralım:

 

void HaftaninIlkGununuGetir()
{

 

System.Globalization.CultureInfo insCultureInfo = System.Globalization.CultureInfo.CurrentCulture;
System.Globalization.CultureInfo insUICultureInfo = System.Globalization.CultureInfo.CurrentUICulture;
Console.WriteLine(“Haftanin ilk gunu, CurrentCulture’da: ” + insCultureInfo.DateTimeFormat.FirstDayOfWeek);
Console.WriteLine(“Haftanin ilk gunu, CurrentUICulture’da: ” + insUICultureInfo.DateTimeFormat.FirstDayOfWeek);
}

 

static void Main(string[] args)
{
Program p = new Program();
p.HaftaninIlkGununuGetir();
Console.ReadKey();
}

 

Görüldüğü gibi CurrentCulture Pazartesi, CurrentUICulture Pazar şeklinde sonuç döndürdü.

 

 

Şimdi CultureInfo class’ının bize bilgi sağlayan önemli iki öğesinden daha bahsetmek istiyorum. Bunlardan birincisi DateTimeFormat DateTimeFormatInfo tipinde seçili culture’a ait tarih ve zaman format bilgisine erişmemizi sağlar. DateTimeFormatInfo nesnesinin birçok property’sinden bazılarını aşağıdaki metodda alabiliriz:

 

void GetDateTimeFormatInfo()
{

 

System.Globalization.DateTimeFormatInfo dtfi =  System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat;
Console.WriteLine(dtfi.AbbreviatedDayNames.Where(i => i.ToLower().IndexOf(“we”) > -1).First()); //kisaltilmis gun isimleri
Console.WriteLine(dtfi.MonthNames.Where(i => i.ToLower().IndexOf(“pr”) > -1).First()); //ay isimleri
Console.WriteLine(dtfi.AbbreviatedMonthNames.First()); //kisaltilmis ay isimleri
Console.WriteLine(dtfi.Calendar); //kullanilan takvim
Console.WriteLine(dtfi.DateSeparator); //tarih ayraci
Console.WriteLine(dtfi.DayNames.Last()); //gun isimleri
Console.WriteLine(dtfi.FirstDayOfWeek); //haftanin ilk gunu
Console.WriteLine(dtfi.FullDateTimePattern); //tam tarih zaman formati
Console.WriteLine(dtfi.GetAbbreviatedDayName(DayOfWeek.Thursday)); //kisaltilmis gun adi al
Console.WriteLine(dtfi.GetDayName(DayOfWeek.Saturday)); //gun adi al
Console.WriteLine(dtfi.GetMonthName(4)); //ay adi al
Console.WriteLine(dtfi.GetShortestDayName(DayOfWeek.Friday)); //kisa gun adi
Console.WriteLine(dtfi.LongDatePattern); //uzun tarih formati
Console.WriteLine(dtfi.LongTimePattern); //uzun saat formati
Console.WriteLine(dtfi.ShortDatePattern); //kisa tarih formati
Console.WriteLine(dtfi.ShortestDayNames.First()); //kisa gun isimleri
Console.WriteLine(dtfi.ShortTimePattern); //kisa saat formati
Console.WriteLine(dtfi.TimeSeparator); //saat ayraci
Console.WriteLine(dtfi.YearMonthPattern); //ay yil formati

 

}

 

Metodu uygulamada çalıştırdığımızda property’lerin değerlerini aşağıdaki gibi görebiliriz:

 

 

CultureInfo class’ının bahsetmek istediğim diğer öğesi de NumberFormatInfo. NumberFormatInfo sayıların ve rakamların mevcut Culture’a göre nasıl görüntülendiğinin belirlendiği class’tır. Aşağıdaki metodda da NumberFormatInfo class’ının bazı önemli property’lerini alıyoruz:

 

void GetNumberFormatInfo()
{

 

System.Globalization.NumberFormatInfo nfi = System.Globalization.CultureInfo.CurrentCulture.NumberFormat;
Console.WriteLine(nfi.CurrencyGroupSeparator); //para birimi ayraci
Console.WriteLine(nfi.CurrencySymbol); //para birimi simgesi
Console.WriteLine(nfi.NaNSymbol); //Not A Number simgesi
Console.WriteLine(nfi.NegativeInfinitySymbol); //negatif sonsuz simgesi
Console.WriteLine(nfi.NegativeSign); //negatif simgesi
Console.WriteLine(nfi.NumberDecimalDigits); //ondalik basamak sayisi
Console.WriteLine(nfi.NumberDecimalSeparator); //ondalik ayraci
Console.WriteLine(nfi.NumberGroupSeparator); //sayi ayraci
Console.WriteLine(nfi.NumberNegativePattern); //negatif sayi paterni
Console.WriteLine(nfi.PercentDecimalDigits); //yuzdeli degerlerde kullanilan ondalik basamak sayisi
Console.WriteLine(nfi.PercentDecimalSeparator); //yuzdeli degerlerde kullanilan ondalik ayraci
Console.WriteLine(nfi.PercentGroupSeparator); //yuzdeli degerlerde sayi ayraci
Console.WriteLine(nfi.PercentSymbol); //yuzde sembolu
Console.WriteLine(nfi.PerMilleSymbol); //binde sembolu
Console.WriteLine(nfi.PositiveSign); //pozitif sayi sembolu

 

}

 

Metodu uygulamada çalıştırdığımızda property’lerin değerlerini aşağıdaki gibi görebiliriz:

 

 

 

 

Umarım faydalı olmuştur.

 

Işıl Orhanel

 

isil@isilorhanel.net

Geliştirdiğimiz uygulamalarda bilhassa son kullanıcının sürekli gördüğü User Interface arabiriminde gerek bilginin toplanması gerek ise bilginin gösterilmesi kullanıcının kullandığı dil bilgilerine uygun olmalıdır. Bu durum bilhassa multilanguage uygulamalarda çok önemli bir konuma gelmektedir. Örneğin İngiltere’deki bir kullanıcı ile Türkiye’de bulunan bir kullanıcı tarih biçimlerini ve ondalık ayraçlarını farklı şekilde görmelidir. Bu makalemde sizlere bu özelliği uygulamalarımıza nasıl kazandırabileceğimizi ve kullanıcının ayarlamış olduğu dil ayarlarını nasıl okuyabileceğimizi anlattım.

Uygulamalarımızda kullanıcının bilgisayarındaki Internet Explorer versiyonunu bilmeye gerek duyduğumuz zamanlar olabilir. Bu durumda Registry’deki HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer altındaki Version öğesinin değerini alarak kurulu IE versiyonunu bulabiliriz.

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. Yazgeliştir’deki bu makalemde .Net framework ile uygulamalarımızda event log kayıtlarını nasıl okuyabileceğimiz hakkında bilgi verdim. Umarım faydalı olur.

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şılOrhanel

 

www.isilorhanel.net

Microsoft Tag Microsoft’un son zamanlarda geliştirdiği ürünlerden en çok hoşuma gideni. Henüz beta aşamasında olan Microsoft Tag, barkod mantığı ile çalışıyor. Kameralı telefonunuz ile Tag’ın resmini çektiğinizde telefonunuza kurulu olan uygulama aracılığı ile Tag sizi online içeriğe anında eriştiriyor. Bu içerik aklınıza gelebilecek herşey olabilir, video, resim, kişi bilgisi, yer bilgisi vs.. Çok yakın zamanda Microsoft Tag’ı her yerde göreceğimizden eminim. Kendisi hakkında daha detaylı bilgi almak ve neler yapabileceğinize dair fikirler için http://www.microsoft.com/tag/content/what/ adresini ziyaret edebilirsiniz.

Ayrıca biz yazılım geliştiriciler için bir API’si de çıkmış bulunuyor:

http://www.microsoft.com/tag/content/support/developer/