Active Directory (LDAP) ve Exchange Server İşlemleri İçin COM+ Server
LDAP ile ilgili yazımızı daha önce uzun ve teknik bir makale olarak kodlarıyla yazmıştık.. O yazının linkini de vererek en azından ilk paragrafını okuyup LDAP ve bu işlemlerin aslında ne işe yaradığını daha rahat görmenizi sağlamaya çalışayım.
LDAP İle KİMLİK DOĞRULAMA ve YETKİLENDİRME (ORACLE & MICROSOFT)
Burada konu olan yazımız için bir .NET vb yazılım dili ile Enterprise Servisleri destek alan yazılım yazmamız gerekir.. Yazılım tabii ki ben de var.. Bu yazılımın belli metodları var ve ben bu metodların başlıklarını ve aldığı parametreleri verip buna karşılık geri dönen değerlerin nasıl algılanması gerektiğini açıkladım.. Ayrıca sadece bir tek metodu da bu yazının en altında görüp inceleyebilirsiniz.. Yine LDAP ile ilgili yukarıda linkini verdiğim yazımda zaten oldukça fazla kod var ve siz oradan yararlanabilirsiniz..
Bu Server yazılımımızın class ı nın 5 adet Metodu bulunmaktadır.
1-) public object GetADUser(string path, string user_name, string password)
GetADUser fonksiyonu 3 tane parametre alır. Kullanıcını AD de olup olmadığına bakar.
Path : LDAP protokolüne göre yazılması gerekir . Örnek olarak Active Directory nin bulunduğu Server adının EVEREST olduğunu varsayarsak path olarak “LDAP://EVEREST” yazmamız gerekir
AD (Active Directory) kullanıcı adının “test” ve şifrenin de “1234” olduğunu varsayalım. O halde GetADUser(“LDAP://EVEREST”,”test”,”1234”) şeklinde bu metodu çağırmalıyız.
Geri döndürdüğü değerlere bakalım :
Değer Anlamı
0 Bu isim ve şifrede kullanıcı AD de var
1 Kullanıcı adı ve/veya şifre yanlış
2 Server adı yanlış
3 Başka bir hata var (Sistem hatası)
2-) public string CreateADUser(string path, string user_Full_name, string user_name, string password, string NC, string Server_Name = “”, string Your_Storage_Group = “”, string Your_Administrative_Group = “”, string Your_Organization = “”, int userAccountControl = 0)
CreateADUser fonksiyonu 5 adet mutlaka yazılması gereken parametre ve 4 tane de isteğe bağlı (optional) parametre alır. Bu isteğe bağlı parametreler kullanıldığında tümünün yazılmasını bekler aksi halde işlem yapmaz. Bu isteğe bağlı parametreler mailbox kullanıcısı oluşturmak içindir. Yazılmazsa o halde sadece AD kullanıcısı oluşturulur.
Path : Yukarıdaki fonksiyon gibi bir LDAP bağlantı string i yazmak gerekir ancak kullanıcı yaratılacağı için biraz farklıdır. AD Server adı yine EVEREST olursa o halde şu şekilde yazmamız gerekir : “LDAP://EVEREST/CN=Users”
User_Full_Name : Bu user_name kadar önemlidir. Kisinin adı ve soyadından oluşabilir ve arada boşlukta olabilir. AD de bir kullanıcı yaratılıldığında CN dediğimiz Container Name içinde bu isimle yaratır. Ve ADSI Edıt programında bu ismi görebiliriz. ( Bu program Windows 2000 Server Utility Programıdır ve CD de Support/Tools içinde installation programı vardır. AD hiyerarşik yapısını bununla rahatça görebilir ve property leri de görebiliriz )
User_Name : Sisteme giriş kullanıcı adı (Logon Name) olarak kullanılacaktır.
Password : Yaratılacak olan kullanıcının sisteme giriş şifresi .
NC (Naming Container) : ayrı ayrı olmak üzere domainadı ve uzantısı. Örneğin domainimiz trading ise : “DC=trading, DC=com” olarak yazılmalıdır.
Server_Name : Exchange Server ın adı.
Your_Storage_Group : Exchange Server daki Storage in adı.
Your_Administrative_Group : Exchange Server daki administrative grubun adı.
Your_Organization : full domain adı örn: “trading.com”
UserAccountControl : 10 lu veya 16 lik sistemde bitlerin degerini set ederek account u disable etmek, password un expire olmamasini saglamak vb islemleri yapar. 66048 = 65536 + 512 -> Password never expire and account enabled
Geri döndürdüğü değerlere bakalım :
Değer Anlamı
“0” Kullanıcı ve şifre aynen yaratıldı.
“user_name=test_1” test isimli kullanıcı vardı test_1 yaratıldı.
“user_full_name=ali veli 1” “ali veli” CN vardı “ali veli 1” yaratıldı
test isimli kullanıcı aynen kullanıldı.
“user_name=test_1$user_full_name=ali veli 1” hem kullanıcı adı hem de CN adı sistemde var idi bunun yerine geri döndürülen değer de ki ler kullanıldı.
“2” veya “3” Server adı hatalı veya başka bir system hatası.
3-) public int UpdateADUser(string path, string set_properties, int userAccountControl = 0)
Bu fonksiyon AD de var olan bir kullanıcının property lerini güncellemede kullanılır.
Path : LDAP bağlantı stringidir. Kullanılışı yukarıdakilerden biraz farklıdır.
Örneğin AD nin bulunduğu Server adı EVEREST , kullanıcı full adı ( CN name ) “ali veli” , domain adı “trading” ve uzantısı “com” olsun. O halde aynen şu şekilde yazmalıyız : “LDAP://EVEREST/CN=ali veli, CN=Users, DC=trading, DC=com”
Set_properties : Set edilecek property ler property1=deger1,property2=deger2 … seklinde gonderilecek.
UserAccountControl : 10 lu veya 16 lik sistemde bitlerin degerini set ederek account u disable etmek, password un expire olmamasini saglamak vb islemleri yapar.
Bu fonksiyonu şu şekilde çağırabiliriz :
UpdateADUser(“LDAP://EVEREST/CN=ali veli, CN=Users, DC=trading, DC=com”, “description=Humanist Kullanicisi”,66048)
66048 = 65536 + 512 -> Password never expire and account enabled
eger sadece 2 yazarsaniz account disable olur..
Geri döndürdüğü değerlere bakalım :
Değer Anlamı
0 İşlem olumlu
1 AD de böyle bir kullanıcı yok
2 Object var property de var ancak baska hata oldu
4-) public int DeleteADUser(string path)
AD de bir kullanıcıyı silmek için kullanılır .
Path : Örneğin AD nin bulunduğu Server adı EVEREST , kullanıcı full adı ( CN name ) “ali veli” , domain adı “trading” ve uzantısı “com” olsun. O halde aynen şu şekilde yazmalıyız : “LDAP://EVEREST/CN=ali veli, CN=Users, DC=trading, DC=com”
Geri döndürdüğü değerlere bakalım :
Değer Anlamı
0 İşlem olumlu
1 AD de böyle bir kullanıcı yok.
2 Kullanıcıyı silemedi.
5-) public int SetADUserPassword(string path, string password)
AD de mevcut bir kullanıcının şifresini değiştirmek için kullanılır.
Path : Örneğin AD nin bulunduğu Server adı EVEREST , kullanıcı full adı ( CN name ) “ali veli” , domain adı “trading” ve uzantısı “com” olsun. O halde aynen şu şekilde yazmalıyız : “LDAP://EVEREST/CN=ali veli, CN=Users, DC=trading, DC=com”
Fonksiyonu çağırırken :
SetADUserPassword(“LDAP://EVEREST/CN=ali veli, CN=Users, DC=trading, DC=com”,”123”)
Şeklinde yazarız ve şifreyi “123” yapar.
Geri döndürdüğü değerlere bakalım :
Değer Anlamı
0 İşlem olumlu
1 AD de böyle bir kullanıcı yok.
2 Şifreyi güncelleyemedi.
Active Directory + Exchange Server İşlemleri İçin COM+ Server ve Client Kuruluş Adımları
1. Windows NT 4.0 ( option pack install edilmiş ) veya Windows 2000 server veya daha yeni bir windows server (windows 10 pro da test yapilabilir) install edilmiş olan bilgisayara .NET Framework 1.1 versionunu öncelikle install edin. ( Client larda gerekmez. Sadece Application Server olana install edilecek. )
2. .NET Framework 1.1 install edilen bilgisayarda ADUtility isimli bir directory yaratın ve bunun içine ADCOMPlusServer.DLL , InteropCDO.dll ve CDO.dll i kopyalayın. COM+ uygulamamızı kopyalayın.
3. Bu directory de iken REGSVCS.EXE isimli .NET Framework utility programını kullanarak ADCOMPlusServer.DLL i şu şekilde register edin : REGSVCS ADCOMPlusServer.DLL. Dikkat : eğer ADCOMPlusServer.DLL programında bir değişiklik yaparsanız REGSVCS /u ADCOMPlusServer.DLL ile unregister edip 2. adımdan itibaren işlemi tekrar etmeniz gerekir.
4. Bu Uygulama Server ında Administrative Tools dan Component Services i seçin veya yeni işletim sistemlerinde bu Apps dir.. Burada Computers -> My Computer -> COM+ Applications ı seçin veya yeni windows sürümlerinde Apps i seçin. Listede 3. adımda register ettiğimiz ADCOMPlusServer ı bulun. Burada Roles kısmında sağ mouse a tıklayın New -> Role seçin. Gelen ekranda bir rol adı girin. ( Bu isim çok önemli değil örneğin Kullanicilar girebilirsiniz. ). Daha sonra bu rol altında Users ı otomatikman göreceksiniz. Burada Sağ Click yapın New -> User I seçin. Listeden bu uygulamayı kullanmayı izin verdiğiniz grup veya kullanıcıları seçin.( Örneğin Domain Users grubunu seçebilirsiniz. )
5. Server ı konfigüre ettik ve şimdi bu COM+ uygulamasını foxpro veya .NET uygulaması içinden çağıracak bütün client lara ayrı ayrı kurmak üzere bu COM+ uygulamamızdan Proxy programı yaratacağız ve bunu her client a ayrı ayrı yükleyeceğiz.
6. Bunun için COM+ uygulamasını yüklediğimiz Server a gidin ve Component Services den COM+ Applications içinde ADCOMPlusServer ı bulun. ( 4.adım da zaten orada idik. ) . Sağ mouse click leyin ve Export u seçin. Ve Next i seçin. Gelen ekranda Application Proxy radio button ını seçin. Aynı ekranda Browse ı seçin ve oluşturulacak 2 adet Client programının nereye save edileceğini ve adını yazın.
7. Bu Client programlarını bir Share e koyup client lardan bağlanıp tek tek yükleyebilir veya diskete alıp yükleyebilirsiniz.
8. Bu iki dosyadan MSI uzantılı olanını çift click ile client da çalıştırın. Ve Control Panel -> Add/Remove Programs a girerek yüklenip yüklenmediğine bakın. ( Listede ise yüklenmiştir. Dikkat ! gerekirse Uninstall u da buradan yapacaksınız. ). COM+ Server uygulamasında yapılacak her değişikliğin client larada yansıması için Client da ki 7. adımda yüklenen programı uninstall edip 6. adımdan itibaren işlemleri tekrar yapmalısınız yani COM+ ın konfigürasyonunda ( Programın kendisinde değil yani Rol ler User lar Identity gibi değişikliklerde ) değişiklik olursa client install işlemini tekrarlamalısınız.
9. Foxpro veya .NET de oluşturduğunuz client uygulamasını client dan test edin.
Foxpro veya .NET veya diğer yazılımlarda nasıl kullanacağız
adObj =CREATEOBJECT(“ADCOMPlusServer.ADUtility”)
kod= adObj.CreateADUser(“LDAP://EVEREST/CN=Users”, “ali veli”, “test”, “123456”,”DC=trading, DC=com”)
? kod
şeklinde çalıştırabilirsiniz. Geri dönen değerleri yukarıda her fonksiyon için ayrı ayrı belirttik. Bunları inceleyerek hangi fonksiyonu hangi parametrelerle çağırabileceğinizi ve geri dönen değerleri nasıl inceleyebileceğinizi anlattık.
Server yazılımımızın class ı içindeki
public object GetADUser(string path, string user_name, string password)
{
// Burada sadece user name var full name yok
var de = new DirectoryEntry(path, user_name, password, AuthenticationTypes.Secure);
var des = new DirectorySearcher();
try
{
string a = de.Name;
de.Close();
return 0;
}
catch (COMException exc)
{
de.Close();
if (exc.Message.IndexOf(“unknown user name or bad password”) > -1)
{
// “User name veya Password Yanlis”
return 1;
}
else if (exc.Message.IndexOf(“The server is not operational”) > -1)
{
// “Server Name Yanlis”
return 2;
}
else
{
// “Bir hata var”
return 3;
}
}
catch (Exception ex)
{
de.Close();
return 3;
}
}
Kalın Sağlıcakla
Selcuk Celik