4 Temmuz 2013 Perşembe

C# ile Windows Registry İşlemleri(Microsoft.Win32)

Hemen hemen her profesyonel uygulamada gördüğümüz Registry'ye yazma ve ordan okuma işlemlerinin nasıl yapıldığını basit bir uygulama ile anlatacağız. Düşününki bir uygulama geliştirdik ve uygulama her çalıştığında kullanıcıyı selamlamak istiyoruz ve uygulamayı kaçıncı defa çalıştırdığını söylemek istiyoruz ona. Bunun bir çok yolu olmasına rağmen en güzel ve en güvenilir yolu ilgili bilgileri Windows un registry dediğimiz bölgesinde tutmaktır. registry dediğimiz yerler olmasaydı pek ala bu işi dosyaya yazma ve okumayla da yapabilirdik. Regsitery bölgesini okuma ve yazma amaçlı .NET framework sınıf kütüphanalerinden faydalanacağız. Bu sınıflar Microsft.Win32 isimalanının altında bulunmaktadır. Bu sınıfların en çok kullanılan metodlarını ve özelliklerini anlatmaya başlamadan önce programızın yapısını kısaca anlatayım.
Bir console uygulaması oluşturacağız. Program ilk çalıştığında bize bundan sonraki açılışlarında bizi selamlaması için adımızı soracak.Daha sonra programı çalıştırdığımızda "Hoşgeldin Sefer. Programı 3. defa çalıştırıyorsunuz." diyecek. Programın kaç defa çalıştığını anlamak için ise program ilk açıldığında registry bölgesine "1" değerini yazacağız ve programın her çalıştığında o değeri bir artıracağız. Böylece programın kaç defa çalıştığını öğrenmiş olacağız. Tabi eğer Windows un <regedit> aracıyla daha önceden uğraştıysanız bizim programlama yoluyla değiştirdiğimiz değerleri kendi ellerinizle gidip değiştirebilirsiniz. Demek istediğim burda şifre ve kullanıcı adı gibi bazı kişiye özel bilgilerin saklanması pek güvenli değildir.

Eğer şu ana kadar registry hakkında bir bilginiz yoksa Start->Run ' menusune gelip regedit yazarak registry hakkında biraz bilgi edinebilirsiniz. Bu programla rastgele değerler silerseniz bazı programlarınız zarar görebileceği için tavsiyem her hangi bir silme işlemi yapmayan ve sadece neler olup
bittiğine bakın.

Şimdi C# ın büyük bir kolaylık sağladığı registry yazma ve okuma için geliştirilmiş RegistryKey sınıfının işlevlerini görelim.
:::: RegistryKey Sınıfı(Microsoft.Win32) ::::.

Bildiğiniz gibi windowsun register yapısı ağaç şeklindeki klasörlere benzer. Her yeni anahtar altında bir alt anahtar açabildiğimiz gibi anahtarlar altında yeni "string" yada "int" gibi değerler oluşturup programla ilgili istediğimiz değerleri saklayabiliriz. Bu ise klasörlerde oluşturduğumuz dosyalara benzer. Daha öncede dediğimiz gibi buraya regedit le kolayca ulaşabildiğimiz için güvenlik amaçlı bilgileri (şifre vs) veya programımızla ilgili kritik bilgileri(serial number vs) burada saklamamamız gerekir. Biz bu programdaki bilgilerimizi HKEY_LOCAL_MACHINE\Software altında csnedir isimli bir alt anahtar oluşturarak kaydedeceğiz.

RegisteryKey sınıfı türünden bir nesne oluşturmak için ya RegiteryKey sınıfının static üye fonksiyonu olan OpenSubKey() metodunu yada yada Register sınıfının static üyelerini kullanırız. Aşğıda detaylı olarak bu metodlar hakkında bilgi bulabilirsiniz.

:: CreateSubKey() Metodu ::

Geriye RegistryKey türünden bir nesne dödüren bu fonksiyon yeni bir alt anahtar oluşturur yada var olan bir anahtarı okumak için açar.Fonksiyonun prototipi aşağıdaki gibidir. Unutmayın bu metodu kullanabilmek için ilgili kullanıcının register bölgesine erişim hakkının olması gerekir. Aksi halde SecurityException hatası oluşur.


public RegistryKey CreateSubKey(string subkey);


:: OpenSubKey() Metodu ::

Bu metod iki şekilde kullanılabilir, overload edilmiş iki metod aşağıdaki gibidir.

public RegistryKey OpenSubKey(string);//Bu metod anahtar okumak amcıyla kullanılır ve geriye RegisteryKey döndürür.


public RegistryKey OpenSubKey(string,bool);//Bu metod ilk metod ile aynıdır fakat eğer açılacak anahtara yazmada yapacaksak ikinci parametreyi true olarak girmemiz gerekir. Varsayalın olarak ReadOnly açılır.


:: DeleteSubKey() Metodu ::

Bu metod iki şekilde kullanılabilir, overload edilmiş iki metod aşağıdaki gibidir.

public void DeletSubKey(string);//Parametre olarak gönderilen alt anahtarı siler.


public void DeletSubKey(string,bool);//Parametre olarak gönderilen alt anahtarı siler.İkinci parametre ise belirtilen alt anahtarın olmaması durumunda "ArgumentNullException" hatasının yakalnıp yakalanmayacağını gösterir.Eğer true ise bu hata yakalanır, false ise herhangi birşey olmaz.

:: DeleteSubKeyTree() Metodu ::

Bu metod iki belirtilen anahtardaki bütün anahtarları siler.Bir dosyayı sildiğinide içindeki tüm dosyaları sildiğiniz gibi.Prototipi aşağıdaki gibidir.
public void DeletSubKeyTree(string);


:: DeleteValue() Metodu ::

İki şekilde kullanılabilir.Parametre olarak belirtilen değeri anahtardan siler.İkinci parametre ise DeleteSubKey() metodunda olduğu gibi hata yakalanıp yakalanmayacağını belirtir.

:: Flush() Metodu ::

Registry 'de yaptığımız değişiklikleri diske kaydetmek için bu metodun çağrılması gerekir.

:: GetSubKeyNames() Metodu ::


Be metod geriye döndürdüğü string dizisine ilgili anahtardaki alt anahtar isimlerini doldurur.Prototipi aşağıdaki gibidir.

public string[] GetSubKeyNames()

:: GetValue() Metodu ::


İlgili anahtardaki değerin içeriğini object türü olarak geri dönderir.İki şekilde kullanılabilir. Parametrik yapısı aşağıdaki gibidir.

public object GetValue(string)
public object GetValue(string,object) //eğer değer yoksa varsayılan olarak parametre olarak verilen object geriye döner.

:: GetValueNames() Metodu ::


İlgili anahtardaki bütün değerleri bir string dizine aktarır.Parametrik yapısı aşağıdaki gibidir

public string[] GetValueNames()

:: SetValue() Metodu ::


Birinci parametresi ile belirtilen anahtara ikinci parametresi ile belirtilen bilgi aktarılır.Parametrik yapısı aşağıdaki gibidir.

public void SetValue(string,object)

:: Name Özelliği ::


Taban anahtardan itibaren(mesela HKEY_LOCAL_MACHINE) ilgili anahtarın tam yolunu verir.

:: ValueCount Özelliği ::


Anahtarda bulunan değerlerin sayısını verir.


RegistryKey sınıfının üye elmanları ve oluşturduğu exception sınıfları ile ilgili detaylı bilgiyi MSDN Online' dan yada .NET Framework SDK Documentation ' dan edinebilirsiniz.

Şimdi yazımızın başında bahsettiğimiz örnek uygulamamıza göz atalım.Aşağıda bulunan kaynak kodda satır aralarına size yardımcı olacak yorumlar ekledim.

//registry.cs

using System;
using System.Win32
//RegistryKey sınıfını kaynakkodda direkt kullanabilmek için bu isimalanını ekledik.

class CsReg
{
public static void Main()
{
RegistryKey register;
register = Registry.LocalMachine.OpenSubKey(@"Software\csnedir",true);
//HKEY_LOCAL_MACHINE/Software/csnedir anahtarını oluşturup anahtara yazma modunda açıyoruz.
if (register.GetValue("ad") == null)
{
/*Bu if bloğunda programın ilk defa çalışması durumu ile ilgili işlemler yapılıyor.Programın ilk defa çalıştığını register.GetValue("ad") ==null ifadesi ile anlıyoruz. Kullanıcıdan isim alınıp registry de "ad" isimli anahtara yazılıyor ve tabili "Oturum" adınıda programı bir defa çalıştırdığını belirten 1 değeri yazılıyor*/
Console.WriteLine("Lütfen adinizi yaziniz");
string ad = Console.ReadLine();
register.SetValue("ad",(string)ad);
register.SetValue("oturum",1);
Console.WriteLine("Tesekkürler...");
}
else
{
/*Bu blokta ise programın sonraki çalışmaları ile ilgili işlemler yapılıyor. Oturum sayısı registry den okunup aritmetik işem yapabilmek için ilgili formata dönüştürüdükten sonra tekrar yeni değeri ile registry ye yazılıyor.Aynı şekilde registry den "ad" değeri alınarak kullanıcı selamlanıyor.*/
string ad = (string)register.GetValue("ad");
int oturum_sayisi=Convert.ToInt32(register.GetValue("oturum"))+ 1;
register.SetValue("oturum",oturum_sayisi);
Console.WriteLine("Hosgeldin " + ad);
Console.WriteLine("Programi " + oturum_sayisi + " kez açtiniz");
Registry.LocalMachine.Flush();
}
}
}


Hiç yorum yok:

Yorum Gönder