.NET destekli programlama dillerini kullanarak Active Directory(AD) üzerinde sorgulamalar yapabiliriz. Bu amaçla .NET Framework, System.DirectoryServices kütüphanesini sunar. Bu kütüphanenin sınıflarını kullanarak, AD üzerinde sorgulamalar yapılabilir, ilgili nesnelere ulaşılabilir, kullanıcıların authentication işlemi sağlanabilir, web/windows/console uygulamalarından AD kayıt güncellemeleri gerçekleştirilebilir. DirectoryServices kütüphanesinin sınıflarına geçmeden önce AD’nin desteklediği LDAP standartından bahsedelim.
LDAP (Lightweight Directory Access Protocol),TCP/IP üzerinde çalışan dizin servislerini sorgulamak ve düzeltmek için kullanılan bir ağ iletişim kuralıdır. Bir dizin mantıksal ve sıralı olarak düzenlenmiş benzer özellikteki bilgiler topluluğudur.Dizine en yaygın örnek telefon rehberidir.Bir telefon rehberinde kişiler veye kurumlar alfabetik olarak dizilmiş isimler ile adresler ve telefon numaralarından oluşur. LDAP özellikle kurum içi personelin kayıtlarının tutulabileceği elverişli bir ortam sunar. Bir kurumda çalışanlara çeşitli servisler sunmanız gerekir. Bunun için her servisin üzerinde çalıştığı makinada ayrı ayrı kullanıcı hesapları açmanız gerekebilir. LDAP kullanarak bu sorun çözülebilir.Kuruma giren personel için LDAP sunucusuna tek bir giriş eklersiniz ve LDAP desteği veren servislerin bu sunucu üzerinden kullanıcı bilgilerine erişim ve doğrulama yapmalarını sağlayabilirsiniz. LDAP, Tcp Port’larından 389′u kullanır, blindrequest, addrequest, delrequest, modifyrequest vs. komutları olan bir iletişim kuralıdır. LDAP; Microsoft ve diğer işletim sistemlerinde Active Directory ile sorunsuz çalışan bir iletişim kuralıdır.
LDAP hiyerarşik yapıda ayrıntılı olarak nitelik bilgilerinin tutulduğu ve genellikle okuma hakkı ile erişilen veri tabanıdır. Bu veri tabanı içerisinde tutulan bilgiler; gruplar, nesneler, nesne sınıfları, kişi, grup, organizasyon nesne gruplarına ait isim, soyisim, e-posta adresi, tel, kullanıcı ev dizini gibi alt bilgilerdir. Aslında Active Directory de LDAP yapısı üzerinde çalışmakla birlikte Unix/Linux sistemlerinde çalışan LDAP ile uyumlu değildir. Değişik LDAP servisi veren yazılımlar olmasına rağmen, açık kaynak kodlu Open LDAP servisi yazılımına http://www.openldap.org adresinden erişilip kurulumu ve yapılandırması gerçekleştirilebilir. Belirtilen site adresinde ve değişik pek çok yerde yazılımla ilgili bol miktarda ayrıntılı belge mevcuttur.
LDAP, tam olarak bir database mimarisine sahip olmasa da hiyerarşik düzende bir database yapısına yakın olduğu için sorgulanması ve üzerinde işlem yapılması kolaydır. LDAP servisi kullanılarak, kullanıcı adı ve şifre ikilisiyle merkez sistemden yetki alınarak merkez sistem üzerindeki nesnelere, sistem bilgilerine, diğer kullanıcılara, domainde olan makinelere erişilebilir.
System.DirectoryServices namespace, AD servisiyle ilgili birçok sınıf içerir. Bunlardan en çok kullanılan iki temel sınıf; DirectoryEntry ve DirectorySearcher classlarıdır. DirectoryEntry sınıfı, Active Directory hiyerarşisindeki bir node veya nesneyi erişmemizi sağlar. Bu sınıfın overlaod edilmiş constructörü, genellikle ulaşılacak merkez sistem adresini, kullanıcı adı ve şifre parametrelerini aldığı versiyonuyla kullanılır. DirectorySearcher sınıfı, Active Directory üzerinde çalışacak sorgulamayı hazırlar. AD’nin bulunduğu merkezi sistemin pathini LDAP standartına göre veriyoruz. Yani LDAP://SunucuAdi/HiyerarsidekiNodeAdi şeklinde uzaktaki sunucuyu işaret edebiliriz. Bu yazıda, örneklerle .NET Framework’ün ilgili sınıf ve üyelerini işleyeceğiz.
-
//AD’ye bağlan
-
//Sunucu hakkında bilgi alalım.
-
Response.Write("Sunucu Adı :" + objDe.Name + " Guid : " + objDe.Guid);
-
-
//Bulunduğumuz hiyerarşideki düğümleri listeyelim.
-
foreach (DirectoryEntry Child in objDe.Children)
-
{
-
Response.Write(Child.SchemaClassName + ": " + Child.Name);
-
}
Bulunduğumuz nodetaki tüm propertylere ve değerlerine erişmek için iç içe bir döngü oluşturmak gerekir. Aşağıdaki kod yardımıyla bu hiyerarşik yapıyı yazdırabiliriz.
-
PropertyCollection Pc = objDe.Properties;
-
foreach (string prName in Pc.PropertyNames)
-
{
-
foreach (object value in objDe.Properties[prName])
-
Response.Write("property = "+ prName +" value ="+ value );
-
}
Active Direcory üzerindeki nesneleri sorgulamak için DirectorySearcher sınıfı kullanılır. Bu sınıfın Filter propertysinde LDAP Search Filter Syntax’ına uygun ifadeler girilerek kayıtlara erişebiliriz.RFC2254 standartına göre kullanılan LDAP arama ifadelerinden bazıları şunlardır;
| Arama filtresi | Açıklama |
|---|---|
| “(objectClass=*)” | All objects. |
| “(&(objectCategory=person)(objectClass=user)(!cn=andy))” | “andy” dışındaki tüm userlar |
| “(sn=sm*)” | surname niteliği “sm” ile başlayan nesneler |
| “(&(objectCategory=person)(objectClass=contact)(|(sn=Smith)(sn=Johnson)))” | Soyadı, “Smith” veya “Johnson” olan tüm contact userler |
Bu ifadelerle ilgili detaylı bilgiyi http://msdn2.microsoft.com/en-us/library/aa746475.aspx adresinde bulabilirsiniz.
Sunucu üzerinde tanımlı makineleri listeyelim. Bunun için AD üzerindeki Computer nesnesini sorgulayacağız.
-
ObjSrch.Filter = "(objectClass=Computer)";
-
-
-
foreach (SearchResult Srch in ObjSrch.FindAll())
-
{
-
objStr.Append(Srch.GetDirectoryEntry().Name.ToString());
-
}
-
-
Response.Write(objStr.ToString());
Sorgulanan bilgileri sıralamak için SortOption sınıfı kullanılır. Kayıtların tüm propertylerini değil de belirli propertylerini getirmek için PropertiesToLoad property kullanılır. Şu şekilde bir sorgulama yapalım. Firma.Com.Tr isimli sunucu üzerindeki Merkez isimli node altındaki IT düğümünü sorgulayalım. Bu düğümde Adı, “Ahmet” olan kişilerin mail ve telefon bilgilerini getirelim. Bunu da e-mail adresline göre A’dan Z’ye doğru sıralayalım.
-
//Konumlanacağımız klasörün pathini verelim.
-
DirectoryEntry objDe = new DirectoryEntry("LDAP://Firma/OU=IT,OU=Merkez,DC=Com,DC=Tr","<Kullanıcı Adı>", "<Şifre>");
-
//Bir arayıcı nesne oluşturalım.
-
//person isimli nesneyi ve Adı, Ahmet olanlanları arayacak.
-
searcher.Filter = "(&(objectClass=person)(givenName=Ahmet))";
-
//mail ve telefon bilgilerini listeye eklesin.
-
searcher.PropertiesToLoad.Add("mail");
-
searcher.PropertiesToLoad.Add("telephoneNumber");
-
-
//Bir sıralayıcı nesnesi tanımlayalım.
-
SortOption Srt;
-
searcher.Sort = Srt;
-
//Sonuçları bir değişkene atalım.
-
SearchResultCollection Results = searcher.FindAll();
-
-
string SearchPath;
-
foreach (SearchResult Result in Results)
-
{
-
SearchPath = Result.Path;
-
Response.Write("Path:" + SearchPath);
-
ResultPropertyCollection Rpc = Result.Properties;
-
foreach (string Property in Rpc.PropertyNames)
-
{
-
foreach (object Value in Rpc[Property])
-
Response.Write("Property =" + Property + " Value =" + Value);
-
}
-
}
Aynı mantıkla DirectoryEntry sınıfının CommitChanges metodu kullanılarak property değerleri üzerinde modify işlemleri yapılabilir.
Uygulamalarımıza giriş yaptırırken kullanıcıların doğrudan AD üzerindeki bilgilerle login olmasını sağlayabiliriz. Böylece şirket içerisindeki personel her uygulama için şifre oluşturmak zorunda kalmaz. Aynı güvenlik bilgileriyle hem makinesine logon olur hem maillerini OWA üzerinden okur hem de uygulamamıza giriş yapmış olur. Bu işlemleri yapmak için özel birşey yapmamıza gerek yok. Yukarıda DirectoryEntry nesnesini tanımladığımız satırda kullanıcının girmiş olduğu bilgilerle AD’ye giriş yapmaya çalışırız dönecek değere göre kullanıcıyı içeri alır veya almayız. Kullanıcı adı veya şifre yanlış olduğu zaman AD’den aşağıdaki hata mesajı döner.Logon failure: unknown user name or bad password.
Active Direcory ile ilgili işlemleri yapmak için projemize System.DirectoryServices kütüphanesini ekleyemi unutmamalıyız.
Kasım 12th, 2007 at 16:59
Ahmet Hocam, eline sağlık çok işime yaradı…
Teşekkürler.
Temmuz 4th, 2008 at 15:50
Çok aydınlatıcı bir yazı olmuş, benim de gerçekten çok işime yaradı.
Türkçe olması da ayrıca çok önemli.
Teşekkürler.