Makale Özeti

Bu makale System.Security.AccessControl ile dosya güvenliği üzerine durmaktadır.Dosyaların kullanıcı erişim haklarını görebilmeyi veya bu haklar üzerinde nasıl değişiklik yapılabileceği anlatılmaktadır.

Makale

System.Security.AccessControl namespace’i temelde dosya erişim güvenliği üzerine durmaktadır.Bu namaspace sayesinde dosyalarınıza kullanıcıların erişim haklarını görebilir veya bu haklar üzerinde değişiklik yapabilirsiniz.

Bir örnek üzerinde konuyu inceleyelim. Aşağıdaki gibi bir tasarım yapıp örneğime başlıyorum.

Yaptığımız programa göre kullanıcı seçtiği bir dosya için Izınleri Al button kontrolüne tıkladığı zaman mevcut izinler hemen alttaki textbox kontrolünde görünecek, Kullanıcı adı girerek belirlediği kullanıcıya yetki ataması veya geri alması işlemi yapabilecek.

Kullanmamız gereken temel namespace’leri using ifadesi ile belirtiyoruz:

using System.IO;

using System.Security.AccessControl;

using System.Security.Principal;

Kullanacağımız namespace’leri belirledikten sonra ilk başta dosya üzerinde hakkı olan kullanıcıların haklarını textbox’a yazdırıyoruz:

// İzinlerine bakılacak olan dosya FileStream ile açılıyor.

            FileStream fs = new FileStream(txtDosya.Text, FileMode.Open, FileAccess.ReadWrite);

           

            /* Üzerinde çalıştığımız dosyanın erişim haklarını bize döndürecek olan method GetAccessControl()

             * metodur.Dönüş tipi ise FileSecurity tipindendir.

             */

            FileSecurity guvenlik = fs.GetAccessControl();

 

            // temiz bir görüntü verebilmek için textbox'ı temizliyoruz

            txtIzinler.Text = "";

 

            /* mevcut izinleri listelemeye başlıyoruz. Mevcut izinleri bize biraz önce tanımladığımız FileSecurity

             * sınıfından olan guvenlik nesnesi sayesinde elde edicez. Bu nesnenin GetAccessRules methodu bize tek tek bilgisayarda

             * tanımlı olan kullanıcı bilgilerini, haklarını döndürecek fakat önce methodun beklediği parametreleri açıklayalım.

             * Bu method 3 parametre alıyor bunlardan ilki erişim kurallarını açıkça almamızı sağlıyor, 2. parametre miras alınan kuralları

             * ifade ediyor , başka bir deyişle bir üst dizinden gelen dosya erişim ayarlarını alıp almayacağını belirliyor, 3. parametre ise

             * hangi tip kullanıcı hesaplarına erişeceğini bildiriyor.

             */

            foreach (FileSystemAccessRule hak in guvenlik.GetAccessRules(true, true, typeof(NTAccount)))

            {

                string metin;

                // Mevcut kullanıcı adı alınıyor.

                // FileSystemAccessRule tipinden olan hak nesnemizin IdentityReference property'si bize kullanıcı domain ve adını döndürüyor.

                metin = hak.IdentityReference.ToString() + " kullanıcısının ";

 

                // mevcut kullanıcının dosyaya erişim hakkı alınıyor.

                metin += hak.FileSystemRights.ToString().ToUpper();

 

                // Dosyaya erişim hakkı için iki tip var. Bunlardan biri izin verilmiş diğeri ise izin verilmemiştir.

                // Eğer izin verildiyse ekrana izin var değilse izin yok diye yazdırıyoruz.

                if (hak.AccessControlType == AccessControlType.Allow)

                {

                    metin += " izni var\r\n";

                }

                else

                {

                    metin += " izni yok\r\n";

                }

               

                // Tüm izinleri aynı anda yazabilmek için txtIzinler textbox'ına izinleri gösteriyoruz. 

                txtIzinler.Text += metin;

 

            }

            // FileStream'i kapatıyoruz.

            fs.Close();

Uygulamamızı çalıştırıp , bir dosya seçiyoruz ve Izınleri Listele butonuna tıklayıp onun mevcut kullanıcı izinlerini alıyoruz.

Kullanıcıya izinleri atama yapmak için ise Izin Ver buttonumuzun click olayına :

private void bntIzinVer_Click(object sender, EventArgs e)

        {

            // Mevcut dosyanın erişim hakları üzerinde işlem yapabilmek için dosyanın guvenliklerine erişiyoruz.

            // Dosyanın güvenlik listesine ulaşmak için File sınıfının GetAccessControl metodunu kullanıyoruz. Bu

            // Method bize FileSecurity tipinden dönüyor.

            FileSecurity dosyaGuvenligi = File.GetAccessControl(txtDosya.Text);

 

            // Seçilen her yetkiyi kullanıcıya atama yapıcaz.

            foreach (string yetki in chYetkiListesi.CheckedItems)

            {

 

                // Erişim hakkı eklemek için bir kural oluşturmamız gerekiyor. Bu kural FileSystemAccessRule tipinden olacaktır.

                // Bu tip sayesinde dosyaya hangi haklar ile ulaşacağını belirliyoruz.

                FileSystemAccessRule kural  ;

                // Kullanıcıya atayacağımız yetkiyi öğreniyoruz. Bu yetkiyi yetkileriAl ismindeki oluşturduğumuz methoddan alacak.

                FileSystemRights atanacakYetki;

                atanacakYetki = yetkileriAl(yetki);

                // kuralımızı oluşturuyoruz. 3 parametre isteniyor. Bunlardan biri kullanıcı, 2. yetki, 3. ise izin tipidir.

                kural = new FileSystemAccessRule( new NTAccount(txtKullanici.Text), atanacakYetki, AccessControlType.Allow);

                // Kuralı dosya güvenlik bilgisine ekliyoruz.Bu işlemi AddAccessRule metodu yapıyor ve parametre olarak kuralımızı bekliyor.

                dosyaGuvenligi.AddAccessRule(kural);

                // Güvenlik ayarlarımızı dosyamıza atıyoruz.File sınıfının SetAccessControl sınıfı bu işlemi yapıyor. 2 parametre alıyor.

                // 1. parametre dosya, 2. ise atanacak güvenliktir.

                File.SetAccessControl(txtDosya.Text, dosyaGuvenligi);

           

            }

        }

Yetkileri alabilmek için Izin Ver button click olayında yetkileriAl isminde bir metod’dan bilgi alacağımızı belittik. Şimdi bu metodumuzu inceleyelim Bu methodumuz checkListBox kontrolünden seçilen işlem tipini bilgisayarın anlayacağı şekle çeviriyor, başka bir deyişle FileSystemRights tipinden dönüş yapıyor.:

private FileSystemRights yetkileriAl(string yetki)

        {

            FileSystemRights verilecekYetki = new FileSystemRights();

            switch (yetki)

            {

               

                case "Izinleri Değiştirebilsin":

                    verilecekYetki = FileSystemRights.ChangePermissions;

                    break;

              

                case "Dosya Yürütebilsin":

                    verilecekYetki = FileSystemRights.ExecuteFile;

                    break;

                case "Tam Kontrol":

                    verilecekYetki = FileSystemRights.FullControl;

                    break;

                case "Düzenleyebilsin":

                    verilecekYetki = FileSystemRights.Modify;

                    break;

                case "Silebilsin":

                    verilecekYetki = FileSystemRights.Delete;

                    break;

                case "Yazbilsin":

                    verilecekYetki = FileSystemRights.Write;

                    break;

              

                default:

                    break;

                   

            }

 

            return verilecekYetki;

    

        }

 

Izin verme işleminden sonra aşağıdaki gibi artık izin ataması yapabiliriz.

Tekrar izinleri al button’una tıkladıktan sonra izinlerin atamasını görebilirsiniz.

İzin atama işlemimiz sorunsuz şekilde çalışıyor. Sıra geldi yasaklama işlemine. Yasaklama işleminde yapacağımız şey Izin ver ile aynı. Aradaki tek fark ise

 

kural = new FileSystemAccessRule( new NTAccount(txtKullanici.Text), atanacakYetki, AccessControlType.Allow);

 

Yerine yasaklama işlemi yani DENY yapacağız :

private void btnYasakla_Click(object sender, EventArgs e)

        {

 

            FileSecurity dosyaGuvenligi = File.GetAccessControl(txtDosya.Text);

 

            foreach (string yetki in chYetkiListesi.CheckedItems)

            {

 

                FileSystemAccessRule kural;

                FileSystemRights atanacakYetki;

                atanacakYetki = yetkileriAl(yetki);

 

// Izinveren kod ile aradaki tek fark burası.Izin vermek yerine yasaklıyoruz.

                kural = new FileSystemAccessRule(new NTAccount(txtKullanici.Text), atanacakYetki, AccessControlType.Deny);

                dosyaGuvenligi.AddAccessRule(kural);

                File.SetAccessControl(txtDosya.Text, dosyaGuvenligi);

 

            }

        }

Biraz önce verdiğimiz izni kaldırıp deniyoruz:

Yasaklama işlemini de başarılı bir şekilde yaptıktan sonra sıra geldi son işleme yani mevcut izinleri kaldırmaya yani belirtilen kullanıcının yetkisini o erişim hakkı için sıfırlamaya.

FileSystemAccessRule kural;

                FileSystemRights yetkiler;

                yetkiler = yetkileriAl(yetki);

                kural = new FileSystemAccessRule(new NTAccount(txtKullanici.Text), yetkiler, AccessControlType.Allow);

 

// Temel Fark burada. Biraz önce SetAccessRule kullanmıştık burada ise RemoveAccessRule kullanıyoruz.

 

                dosyaGuvenligi.RemoveAccessRule(kural);

 

                File.SetAccessControl(txtDosya.Text, dosyaGuvenligi);

               

                kural = new FileSystemAccessRule(new NTAccount(txtKullanici.Text), yetkiler, AccessControlType.Deny);

                dosyaGuvenligi.RemoveAccessRule(kural);

 

                File.SetAccessControl(txtDosya.Text, dosyaGuvenligi);

 

Yetkiyi kaldırmak için Izin ver buttonu ile kodları yazıyoruz fakat aradaki fark AddAccessRule metodu yerine RemoveAccessRule metodu kullanıyoruz. Bu metod için önce izin için bir kural oluşturup o kuralı kaldırıyoruz, sonra da yasaklama için bir kural oluşturup o kuralı kaldırıyoruz ve dolayısıyla mevcut izinleri kaldırmış oluyorsunuz.

Bir başka makalede görüşmek üzere.

Okan Tekeli

C# MVP, MCT

http://www.okantekeli.com