31 Ekim 2013 Perşembe

C# ile Kayıt Defteri (Registry) İşlemleri

C# (csharp)  da kayıt defterinden kayıt okuma (read value from Registry), kayıt defterindeki kaydı güncelleme (change value to Registry), kayıt defterine yeni kayıt yazma (write value to Registry), kayıt defterindeki kaydı silme (delete value from Registry), kayıt defterine yeni anahtar oluşturma (create key to Registry) ve kayıt defterindeki anahtarı silme (delete key from Registry) işlemlerinin nasıl gerçekleştirildiğini örneklerle sizlere aktarmaya çalışacağım. İlk olarak kayıt defterinden kayıt okuma örneğini inceleyelim. Kayıt defteri üzerinde işlem yapabilmek Microsoft.Win32 kütüphanesini projemize dahil etmemiz gerekmektedir. Bunun için aşağıdaki kod satırını projemizin en baş kısmına eklememiz yeterli olacaktır.
using Microsoft.Win32;
Kayıt defteri üzerinde işlem yapabilmek için Registry sınıfının özelliklerinden faydalanacağız. Kayıt defterinden değer okuma işlemi için aşağıdaki örneği inceleyelim.
// Registry.ClassesRoot - Kayıt Defterindeki Classes Root altındaki anahtarlara erişmek için
// Registry.CurrentConfig - Kayıt Defterindeki Current Config altındaki anahtarlara erişmek için
// Registry.CurrentUser - Kayıt Defterindeki Current User altındaki anahtarlara erişmek için
// Registry.LocalMachine - Kayıt Defterindeki Local Machine altındaki anahtarlara erişmek için
// Registry.Users - Kayıt Defterindeki Users altındaki anahtarlara erişmek için
  
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
RegistryKey key2 = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", false);
RegistryKey key3 = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
//OpenSubKey methodunu ile belirtiğimiz anahtara erişip onu oluşturduğumuz key nesnesine aktardık
//İkinci parametre true olduğu zaman hem okunabilir hem yazılabilir olarak açılır
//İkinci parametre false olduğu zaman yada kullanılmadığı zaman sadece okunabilir olarak açılır
   
//Eğer anahtar mevcut değilse key nesnesi null değerini alır
if (key!=null)
{
    //GetValue methodu belirtiğimiz değeri okumak için kullanılır.
    //5 çeşit değer türü bulunmaktadır
    //Dize Değeri (REG_SZ)
    //İkili Değer (REG_BINARY)
    //DWORD Değeri (REG_DWORD),
    //Çok Dizeli Değer (REG_MULTI_SZ)
    //Genişletilebilir Dize Değeri (REG_EXPAND_SZ)
     
    //Dize Değeri türündeki değer için
    if (key.GetValue("DizeDeğeri") != null)
    {
        //Dize Değeri türündeki değer string olarak kullanılabilir
        MessageBox.Show(key.GetValue("DizeDeğeri").ToString());
    }
   
    //İkili Değer türündeki değer için
    if (key.GetValue("İkiliDeğer") != null)
    {
        //İkili değer hexadecimal olarak tutuluyor.
        byte [] dizi = (byte [])key.GetValue("İkiliDeğer");
        for (int i = 0; i < dizi.Length; i++)
        {
            //byte dizisindeki değerler hexadecimal sisteme çeviriyoruz.
            //Eğer hexadecimal formatına çevirmezsek değerler onluk sistemde gösterilecektir.
            MessageBox.Show(String.Format("{0:x2}", dizi[i]));
        }
    }
   
    //DWORD türündeki değer için
    if (key.GetValue("DWORDDeğeri") != null)
    {
        //16 lık sistemdedir.  bize 10 luk sistemdeki değerini döndürür.
        //Tekrardan 16 lık sisteme çeviriyoruz.
        //Eğer 16 lık sisteme çevirmezsek 10 luk sistemde gözükecektir
        MessageBox.Show(String.Format("{0:x2}",key.GetValue("DWORDDeğeri")));
    }
   
    //Çok Dizeli Değer türündeki değer için
    if (key.GetValue("ÇokDizeliDeğer") != null)
    {
        //String Dizisi olarak kullanılır
        string [] dizi = (string [])key.GetValue("ÇokDizeliDeğer");
        for (int i = 0; i < dizi.Length; i++)
        {
            MessageBox.Show(dizi[i]);
        }
    }
   
    //Genişletilebilir Dize Değeri türündeki değer için
    if (key.GetValue("GenişletilebilirDizeDeğeri") != null)
    {
        //Genişletilebilir dize değeri de string olarak tutulmaktadır.
        MessageBox.Show(key.GetValue("GenişletilebilirDizeDeğeri").ToString());
    }
}
   
//Kullandığımız key nesnesini kapatarak işlemi sonladırıyoruz
key.Close();
Bütün türler için okuma işlemi yukarıdaki kod bloğunda gösterildiği gibidir. Yeni değer oluşturma ve var olan değeri güncelleme işlemlerini örnek üzerinde inceleyelim. Bu iki işlem aynı şekilde gerçekleştirilmektedir. Aşağıdaki kod örneğinde bu iki işlemin nasıl gerçekleştirildiğini inceleyelim.
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);
//Güncelleme ve Yeni Değer oluşturma işlemi için belirttiğimiz anahtarı yazılabilir modda açmamız gerekmektedir.
//Yani ikinci parametreyi true olarak belirlemeliyiz
    
if (key != null)
{
    //SetValue methodu iki şekilde çalışmaktadır.
    //Birincisi iki parametreli, değer adı ve değer değeri.
    //İkincisi 3 parametreli değer adı,değer değeri ve değer türü
    //SetValue methodu kullanırken eğer belirttiğimiz adda bir değer mevcut ise o değerin değeri güncellenir
    //Eğer belirttiğimiz adda bir değer yoksa yeni değer oluşturulur.

    //Değer türünü belirtmezsek ikinci parametre türüne bakılır
    //string tipinde olduğu için Değer türü Dize Değeri (REG_SZ) olarak tanımlanır
    //Ayrıca değer değerinin türü long,byte,double,char olursa yine Dize Değeri (REG_SZ) olarak tanımlanır
    key.SetValue("DizeDeğeri", "61");
    key.SetValue("DizeDeğeri2", (long)61);
    key.SetValue("DizeDeğeri3", (double)61);
    key.SetValue("DizeDeğeri4", (byte)61);
    key.SetValue("DizeDeğeri5", 'A');
    //Eğer 3. parametreyi yani değer türünü String olarak belirtirsek 2. parametrenin türüne bakılmaz
    //İkinci parametre integer olsa bile Değer türü string olarak belirtildiği için
    //gönderilen değer string e çevirilip o şekilde işleme alınacaktır ve Dize Değeri olarak tanımlanacaktır
    key.SetValue("DizeDeğeri6",61, RegistryValueKind.String);
   
    //Değer türünü belirtmezsek değer değerinin tipi byte tipinde dizi olursa
    //değer türü İkili Değer (REG_BINARY) olarak tanımlanır.
    byte[] diziByte = new byte[] { 1, 2, 3 };
    //Kayıt defterinde 16 hexadecimal sistemde tutulur.
    key.SetValue("İkiliDeğer", diziByte);
    //Değer türünü Binary olarak belirtiğimiz için Değer Türü İkili Değer olarak tanımlanacaktır.
    //Burada ikinci parametre byte türünde dizi olmak zorunda.
    //Format dönüştürme işlemini kendisi gerçekleştirmemektedir.
    key.SetValue("İkiliDeğer2", diziByte, RegistryValueKind.Binary);
   
    //Değer türünü belirtmezsek değer değerinin tipi integer olursa
    //değer türü DWORD Değeri (REG_DWORD) olarak tanımlanır.
    key.SetValue("DWORDDeğeri", 55);
    //Değer türünü belirtirsek değer değerinin türü long,string,double olsa bile değer türü
    //DWORD Değeri (REG_DWORD) olarak tanımlanır
    key.SetValue("DWORDDeğeri2", (long)66,RegistryValueKind.DWord);
    key.SetValue("DWORDDeğeri3", (byte)66, RegistryValueKind.DWord);
    key.SetValue("DWORDDeğeri4", (double)66, RegistryValueKind.DWord);
    key.SetValue("DWORDDeğeri5", "66", RegistryValueKind.DWord);
    //Değer değerinin türü char olursa karakter kodu kaydedilir. Örn A ise 65 olarak kaydedilir.
    key.SetValue("DWORDDeğeri6", 'A', RegistryValueKind.DWord);
   
    //Değer türünü belirtmezsek değer değerinin tipi string tipinde dizi olursa
    //değer türü Çok Dizeli Değer (REG_MULTI_SZ) olarak tanımlanır.
    string[] diziString = new string[] { "Sinan", "AKYAZICI", "www.sinanakyazici.com" };
    key.SetValue("ÇokDizeliDeğer", diziString);
    //Değer türünü MultiString olarak belirtiğimiz için Değer Türü Çok Dizeli Değer olarak tanımlanacaktır.
    //Burada ikinci parametre string türünde dizi olmak zorunda.
    //Format dönüştürme işlemini kendisi gerçekleştirmemektedir.
    key.SetValue("ÇokDizeliDeğer2", diziString,RegistryValueKind.MultiString);
   
    //Eğer Genişletilebilir Dize Değeri türünde değer kaydetmek istiyorsak değer türünü
    //ExpandString olarak belirtmemiz gerekmektedir.
    //Değer değerinin türü string,integer,long,double,byte,char olabilir.
    key.SetValue("GenişletilebilirDizeDeğeri", "33", RegistryValueKind.ExpandString);
    key.SetValue("GenişletilebilirDizeDeğeri2", 33, RegistryValueKind.ExpandString);
    key.SetValue("GenişletilebilirDizeDeğeri3", (long)33, RegistryValueKind.ExpandString);
    key.SetValue("GenişletilebilirDizeDeğeri4", (double)33, RegistryValueKind.ExpandString);
    key.SetValue("GenişletilebilirDizeDeğeri5", (byte)33, RegistryValueKind.ExpandString);
    key.SetValue("GenişletilebilirDizeDeğeri6", 'A', RegistryValueKind.ExpandString);
   
    //Registry de yaptığımız değişikliklerin diske kaydedilmesi için Flush methodunu çağırıyoruz
    key.Flush();
}
   
//Kullandığımız key nesnesini kapatarak işlemi sonlandırıyoruz.
key.Close();
Kayıt Defterinden değer silme işlemini aşağıdaki örnek üzerinde inceleyelim.
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);
//Silme işlemi için belirttiğimiz anahtarı yazma modunda açmamız gerekmektedir.
if (key != null)
{
    //Silmek istediğimiz denemeDeğer adında bir değer olup olmadığını kontrol ediyoruz.
    //Çünkü öyle bir değer yoksa ve bunu silmek istersek hata meydana gelecektir.
    if (key.GetValue("DizeDeğeri")!=null)
        //DeleteValue methoduna değerin adını gönderip silme işlemini gerçekleştiriyoruz.
        key.DeleteValue("DizeDeğeri");
   
    //Registry de yaptığımız değişikliklerin diske kaydedilmesi için Flush methodunu çağırıyoruz
    key.Flush();
}
   
//Kullandığımız key nesnesini kapatarak işlemi sonlandırıyoruz.
key.Close();
Son olarak anahtar oluşturma ve anahtar silme işlemlerini örnek üzerinde inceleyelim.
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
//Belirttiğimiz anahtarı yazılabilir modda açmamız gerekmektedir.
   
if (key != null)
{
    //Belirttiğimiz anahtar altında başka bir anahtar oluşturmak istersek
    //CreateSubKey methoduna anahtar ismini vererek kullanırız.
    //Verdiğimiz isimde anahtar yoksa yeni bir anahtar oluşturur ve onu geriye döndürür,
    //Verdiğimiz isimde anahtar varsa geriye o anahtarı döndürür OpenSubKey methodu gibi
    RegistryKey key2 = key.CreateSubKey("Deneme");
    //Oluşturduğumuz yeni anahtar altında aşağıdaki gibi yeni değer oluşturabiliriz
    key2.SetValue("DizeDeğeri", "Deneme Dize Değeri");
   
    //Silme işleminde dikkat edeceğimiz bir nokta var.
    //Silmek istediğimiz anahtarın üst dizininde olmamız gerekir.
    //Yani Deneme anahtarını silmek için bir üsteki Run anahtarına konumlanmamız gerek
    //Silme işlemi için DeleteSubKey methoduna anahtar ismini vererek kullanırız
    key.DeleteSubKey("Deneme");
   
    //DeleteSubKey methodu ile silmek istediğimiz anahtar altında başka anahtar varsa hata meydana gelecektir.
    //Eğer altındaki bütün anahtarla birlikte silmek istersek DeleteSubKeyTree methodunu kullanmamız gerekir
    key.DeleteSubKeyTree("Deneme");
   
    //Registry de yaptığımız değişikliklerin diske kaydedilmesi için Flush methodunu çağırıyoruz
    key.Flush();
    key2.Flush();
    key2.Close();
}
   
//Kullandığımız key nesnelerini kapatarak işlemi sonlandırıyoruz.


Hiç yorum yok:

Yorum Gönder