DirectoryEntry Sınıfı

Eyl 06, 2013

Aktif dizin (Active directory) ağ kaynaklarının organize edilmesini, yönetilmesini ve denetimini sağlayan bir sistemdir. Özellikle kurumsal anlamda hiyerarşik olması ve merkezi olarak yönetilebilmesi sayesinde çok sayıda kullanıcı, grup ve kaynağın yönetilmesinde kullanılır. Aktif dizinde kayıtlar hiyerarşik bir düzende tutulduğu için verilere erişmek veritabanındaki verilere erişmekten daha hızlıdır. Bununla birlikte aktif dizin, ağın yerleşimini (topology) ve protokollerinin yapılandırılmasını da üstlenir.

.NET destekli programlama dilleri kullanılarak aktif dizin üzerinde sorgulamalar yapılabilir. Bu amaçla .NET Framework’te, System.DirectoryServices kütüphanesi vardır. Bu kütüphanenin sınıfları kullanılarak, aktif dizin üzerinde çeşitli işlemler yapılabilir, ilgili nesnelere ulaşılabilir, kullanıcıların kimlik denetimi (authentication) işlemi sağlanabilir, konsol uygulamalarından aktif dizin kayıt güncellemeleri gerçekleştirilebilir.

System.DirectoryServices isimuzayı (namespace), aktif dizin servisiyle ilgili birçok sınıf içerir. Bu sınıfların en çok kullanılanlarından biri DirectoryEntry sınıfıdır. DirectoryEntry sınıfı, aktif dizin hiyerarşisindeki bir düğüm (node) veya nesneye erişilmesini sağlar. Bir DirectoryEntry nesnesi şu şekilde oluşturulur :         

             DirectoryEntry de = new DirectoryEntry("LDAP://<Sunucu Adı>", "<Kullanıcı Adı>", "<Şifre>", System.DirectoryServices.AuthenticationTypes.Secure);

İlk parametrede bağlanılacak sunucu adından önce yazılan LDAP (Lightweight Directory Access Protocol - Hafifletilmiş Dizin Erişim Protokolü) isimli protokol, TCP/IP üzerinde çalışan dizin servislerini sorgulamak ve düzeltmek için kullanılan bir ağ iletişim kuralıdır. Örneğin bir kurumda, çalışanlara çeşitli servisler sunulur. Bunun için her servisin üzerinde çalıştığı makinada, ayrı ayrı kullanıcı hesapları açmak yerine LDAP sunucusuna kişiler eklenerek, servislerin bu sunucu üzerinden kullanıcı bilgilerine erişim ve doğrulama yapmaları sağlanabilir. Bu şekilde kullanıcıların kaynaklara erişim izinleri düzenlenebilir ve bu izinler doğrultusunda kaynaklara erişim kontrol edilebilir. LDAP ile ilgili daha fazla bilgiye LDAP (Lightweight  Directory Access Protocol - Hafifletilmiş Dizin Erişim Protokolü) dökümanından ulaşılabilir. Diğer parametreler kullanıcı adı, şifre ve güvenlik tipidir.

LDAP, dizinlerde aşağıdaki işlemlerin yapılmasına izin verir:

  • Kullanıcın girdiği kritere göre arama yapma
  • Bir girdi(entry) ekleme
  • Bir girdi silme
  • Bir girdiyi değiştrime
  • Distinguished name (DN)'in ya da RDN(Relative Distinguished Name)' in dizindeki yerini değiştirme
  • İki girdiyi karşılaştırma 

DirectoryEntry sınıfının bazı nitelikleri şunlardır :

  • AuthenticationType : 
        
        None : Temel kimlik denetimi vardır.
        Anonymous : Kimlik denetiminin olmadığı anlamına gelir.
        Secure : Güvenli bağlantı kurulmasını sağlar.
        Encryption : Nesneye şifreli bir değer ekler ve taşıma esnasında her hangi bir değişiklik olmamasını sağlar.
        Delegation : Bir aktif dizin nesnesi etki alanları arasında taşınacağı zaman gereklidir.

  • Name : DirectoryEntry nesnesinin ismini içerir.
  • Username : Aktif dizine bağlanırken kullanılacak kullanıcı adı.
  • Password : Aktif dizine bağlanırken kullanılacak şifre.
  • Properties : DirectoryEntry nesnesinin özelliklerini içerir.
  • Path : DirectoryEntry nesnesi ile ulaşılacak olan aktif dizinin yolunu tutar.
  • Parent : Aktif dizin hiyerarşisinde düğümün ebeveyni olan düğümü tutar.
  • Children : Aktif dizin hiyerarşisinde düğümün çocuğu olan düğümü tutar.

DirectoryEntry sınıfının en çok kullanılan metotları şunlardır :

  • CommitChanges() : Aktif dizinde yapılan değişiklikleri kaydeder.
  • Invoke() : Bir metot çağırır. Parametre olarak çağrılacak metodun adını ve çağrılan metoda gönderilecek parametreleri alır.
  • DeleteTree() : Kendisini çağıran girdiyi ve onun alt ağacını aktif dizinden siler.
  • Close() : DirectoryEntry nesnesi ile kurulan bağlantıyı kapatır ve bellekten alınan tüm alanları iade eder.

Aktif dizinde yapılan bazı işlemler DirectoryEntry sınıfı üzerinden şu şekilde yapılır:

Kullanıcı hesabı oluşturma:

public string KullaniciHesabiOlustur(string ldapYolu, string kullaniciAdi, string kullaniciSifre){
     string oGUID = string.Empty;      try
     {
          DirectoryEntry de = new DirectoryEntry("LDAP://" + ldapYolu);
          DirectoryEntry yeniKullanici = de.Children.Add("CN=" + kullaniciAdi, "user");
          yeniKullanici.Properties["samAccountName"].Value = kullaniciAdi;
          yeniKullanici.CommitChanges();
          oGUID = yeniKullanici.Guid.ToString();
          yeniKullanici.Invoke("SetPassword", new object[]{kullaniciSifre});
          yeniKullanici.CommitChanges();
          
          de.Close();
          yeniKullanici.Close();
     }
     catch (System.DirectoryServices.DirectoryServicesCOMException E)
     {
          Console.WriteLine(E.Message.ToString());
     }

     return oGUID;
}

Grup oluşturma:

public void GrupOlustur(string ouPath, string grupAdi)
{
     if (!DirectoryEntry.Exists("LDAP:///CN=" + grupAdi + "," + ouPath))
     {
          try
          {
               DirectoryEntry de = new DirectoryEntry("LDAP://" + ouPath);
               DirectoryEntry yeniGrup = de.Children.Add("CN=" + grupAdi, "group");
               yeniGrup.Properties["sAmAccountName"].Value = grupAdi;
               yeniGrup.CommitChanges();
          }
          catch (Exception e)
          {
               Console.WriteLine(e.Message.ToString());
          }
     }
     else { Console.WriteLine(ouPath + " already exists"); }
}

Gruba Kullanıcı Ekleme:

public void KullaniciyiGrubaEkle(string kullaniciDn, string grupDn)
{
     try
     {
          DirectoryEntry de = new DirectoryEntry("LDAP://" + grupDn);
          de.Properties["member"].Add(kullaniciDn);
          de.CommitChanges();
          de.Close();
     }
     catch (System.DirectoryServices.DirectoryServicesCOMException E)
     {
          Console.WriteLine(E.Message.ToString());
     }
}

Nesne Taşıma:

public void NesneTasi(string konum, string hedef)
{
     DirectoryEntry nesneninYeri = new DirectoryEntry("LDAP://Sunucu_IP_Adresi" + konum);
     DirectoryEntry yeniYer = new DirectoryEntry("LDAP://Sunucu_IP_Adresi" + hedef);
     nesneninYeri.MoveTo(yeniYer, nesneninYeri.Name);
     yeniYer.Close();
     nesneninYeri.Close();
}