07 Eylül 2008

WSH (Windows Scripting Host) İle Active Directory’de Programlama

Visual Basic Script kodlarını kullanarak Active Directory içerisinde nesne oluşturma, silme, nesneler üzerinde değişiklikler yapma, nesneleri sorgulama, toplu halde nesneler açma gibi işlevleri yerine getirebilirsiniz.

RootDSE Nedir

RootDSE’nin amacı kullanıcı nesnesini Active Directory’ye bağlamak için gerekli tutamağı sağlamaktır. RootDSE’nin açılımı Root Directory Service Entry’dir. RootDSE objelerin ne yaptıklarını açıklar. Teknik olarak VBS’den daha ziyade WSH ile GetObject methodunu kullanarak Active Directory’ye bağlantıyı sağlar. Büyük organizasyonlarda RootDSE’yi root domain’e göre belirleyebilirsiniz. Normalde RootDSE o anda bulunulan domain’e ayarlıdır. Bütün bu söylediklerimizin özeti olarak RootDSE’nin active directory’nin ta kendisi olduğunu söylememiz yanlış olmaz.

ADSI Edit - Support Tool

RootDSE’nin ne yaptığına farklı bir perspektiften bakarsak, bunu bize en iyi açıklayacak araç Windows Server 2003 CD’si içerisindeki Support dizini içerisindeki Tools dizininden Windows Server Support Tool’lar kurulduktan sonra gelen ADSIEDIT aracıdır. ADSI, Active Directory içerisindeki kullanıcı ve bilgisayar gibi objelerin özelliklerini ve niteliklerini öğrenmek için gerekli grafiksel arayüzü sağlar. ADSIEDIT kullanarak Active Directory yapısındaki üç kabın içerisini görebilirsiniz.Bunlar:

Domain
Configuration
Schema

Biz bu kapların her birine partition(active directory database bölümleri) adını veriyoruz.

1 - RootDSE ‘den Domain adını çekmek

' RootDSE nesnesinden domain adını çeken kod.
Set objRootDSE = GetObject(ldap://RootDSE/)
strDomain = objRootDSE.Get("DefaultNamingContext")

Eğer mevcut domain adını görmek isterseniz yukarıdaki kodun en alt satırına aşağıdaki satırlardan birini yazın. Böylece domain adını çekip size bir mesaj kutusunda gösterecektir.

WScript.Echo strDomain ' Domain adını control etmek için test amaçlı konuldu

Veya

Msgbox(strDomain) ' Domain adını control etmek için test amaçlı konuldu

Not 1: Biz bu örnekte objRootDSE ve strDomain değişken isimlerini kullandık. Sizde kendinize uygun, kurallara uyan degisken isimlerini rahatça kullanabilirsiniz. Fakat tabii ki anlamlı değişkenler kullanmak en iyisidir.

Not 2: DefaultNamingContext RootDSE (Active Directory) ‘nin bir özelliğidir.

2 – Objelerin Oluşturulacağı Yerin(objContainer) Belirlenmesi

Set objContainer = GetObject("LDAP://" & strOUContainer)

Not 1: strOUContainer nesnelerin oluşturulacağı yeri gösteren son derece önemli bir değişkendir. Bu değişkenin değerini domain adınıza ve OU adına gore doğru bir biçimde ayarlamalısınız.

Not 2: "LDAP://" nesnenin oluşturulacağı hedef yerin active directory olduğunu söyler.

Şimdi uygulamalarla bunları görelim.

Uygulama 1: OU Olusturma

Notepad`i acin.
OUac.vbs isimli bir dosya olusturun.
Asagidaki kodlari bu dosya icine yazin.

Set oRoot = GetObject(ldap://rootDSE/)
Set oDomain = GetObject("LDAP://" & oRoot.Get("defaultNamingContext"))
Set oOU=oDomain.Create("organizationalUnit", "ou=maya")
oOU.Put "Description", "MAYASOFT Bilgi Teknolojileri Merkezi"
oOU.SetInfo

Yukarıdaki script kodunu yazıp çalıştırdıktan sonra bulunduğunuz domain altında maya isimli bir OU açar ve Description özelliğine MAYASOFT Bilgi Teknolojileri Merkezi ifadesini atar.

Uygulama 2: Kullanıcı Olusturma

Set oRoot = GetObject(ldap://rootDSE/)
Set oDomain = GetObject("LDAP://" & oRoot.Get("defaultNamingContext"))
Set oUser = oOU.Create("User", "cn=egitmen")
oUser.Put "sAMAccountName", " egitmen "
oUser.Put "Description", "Marka Olmus Uzman Egitmenler"
oUser.SetInfo
oUser.SetPassword "123+abc"
oUser.AccountDisabled = False
oUser.SetInfo
Wscript.Echo "Basariyla tamamlandi, Active Directory Users and Computers bakın!!!"

Yukarıdaki script kodunu yazıp çalıştırdıktan sonra bulunduğunuz domain altında egitmen isimli bir kullanıcı açar ve Description özelliğine Marka Olmus Uzman Egitmenler yazar. Burada SETINFO methodu onaylama amaçlı kullanılır. Setinfo satırına gelene kadar henüz obje oluşturulmaz. Setinfo satırı ile işleme onay verilir. SetPassword ile kullanıcı hesabına şifre atanır. AccountDisabled methodu ile kullanıcı hesabının enable mı yoksa disable mı olarak açılacağı belirlenir. Yapılan bu değişiklikler yine veritabanına yazılması ve güncellenmesi için setinfo methodu ile onaylanmıştır. Wscript.Echo ile işlem tamamlandıktan sonra bir mesaj görüntüleme gerçekleştirilmiş oluyor.

Uygulama 3: Toplu Kullanıcı Olusturma

'TOPLUM OU’su içerisine toplu kullanıcı ekleme

'Mesut Aladağ – Yasin Aşır tarafından yazılmış script
Dim nesneOUSet oRoot = GetObject(ldap://rootDSE/)
Set oDomain = GetObject("LDAP://" & oRoot.Get("defaultNamingContext"))
Set objRootDSE = GetObject(ldap://rootDSE/)
Set nesneOU=oDomain.Create("organizationalUnit", "ou=Toplum")
nesneOU.Put "Description", "Mesut Aladağ – Yasin Aşır Yazdı…"
nesneOU.SetInfo
Set nesnekap= GetObject("LDAP://OU=Toplum," & _objRootDSE.Get _("defaultNamingContext"))
For i = 1 To 10
Set nesnetip=nesnekap.Create("User", "cn=Kullanici" & i)
nesnetip.Put "sAMAccountName", "Kullanici" & i
nesnetip.SetInfo
Next
WScript.Echo "Tebrikler, 10 Kullanıcı açıldı F5 basarak güncelleyin"

Yukarıdaki kod çalıştırılınca once domain altında Toplum isimli bir OU açar. Daha sonra bu OU içerisine kullanıcı1’den kullanıcı 10’a kadar 10 adet kullanıcı oluşturur.

VBScript Kullanarak Satis OU’su içerisine Kullanıcı Ekleme

Bu örnekte, VBScript kullanarak Satis OU’su içerisine yeni bir kullanıcı eklemeyi öğreneceksiniz. Bu örnek ADSI ve VBScript ile active directory’de programlamanın kolaylığı ve rahatlığını göreceksiniz.Bu örnekte biz kullanıcının sadece belli özelliklerini tanımladık.Siz arzu ederseniz tüm özelliklerini tanımlayabilirsiniz.

NotePad’i açın ve aşağıdaki kodu yazıp, UserAC.vbs adı ile kaydedin ve çalıştırın.

Set oRoot = GetObject("LDAP://rootDSE")
Set oDomain = GetObject("LDAP://ou=satis," & oRoot.Get("defaultNamingContext"))
Set objRootDSE = GetObject("LDAP://rootDSE")
Set oUser=oDomain.Create("User", "CN=Feyzo")
oUser.Put "samAccountName","Feyzo"oUser.Put "givenName","Feyzo"
oUser.Put "sn","Kibar"
oUser.Put "userPrincipalName",feyzok@mayasoft.com.tr
oUser.SetInfo
Set oUser = Nothing 'oUser değişkenini siliyor.
Set oDomain = Nothing ' oDomain değişkenini siliyor.
WScript.Echo "Tamamlandı"

Yukarıdaki kodu çalıştırdığınızda active directory içerisindeki satış OU’su içerisine Feyzo isimli bir kullanıcı hesabının eklendiğini göreceksiniz.

VBScript Kullanarak Kullanıcı Silmek

Bu örnekte, VBScript kullanarak Satis OU’su içerisindeki feyzo isimli kullanıcı hesabını silmeyi öğreneceksiniz.

NotePad’i açın ve aşağıdaki kodu yazıp, UserSIL.vbs adı ile kaydedin ve çalıştırın.

Set oRoot = GetObject("LDAP://rootDSE")
Set oDomain = GetObject("LDAP://ou=satis," & oRoot.Get("defaultNamingContext"))
Set objRootDSE = GetObject("LDAP://rootDSE")
oDomain.Delete "User", "CN=Feyzo"
Set oDomain = Nothing 'oContainer değişkenini siliyor.
WScript.Echo "Tamamlandı"

VBScript Kullanarak Toplu Olarak Kullanıcı Özelliklerini Değiştirme

Bu örnekte, VBScript kullanarak Satis OU’su içerisindeki bütün kullanıcı hesaplarının adres bilgilerinde güncellemeler yapacağız.

NotePad’i açın ve aşağıdaki kodu yazıp, UserDegistir.vbs adı ile kaydedin ve çalıştırın.

Set oRoot = GetObject("LDAP://rootDSE")
Set oDomain = GetObject("LDAP://ou=satis," & oRoot.Get("defaultNamingContext"))
Set objRootDSE = GetObject("LDAP://rootDSE")
ModifyUsers oDomain
Set oDomain = Nothing 'oContainer değişkenini siliyor.
WScript.Echo "Tamamlandı"

Sub ModifyUsers(oObject)
Dim oUser
oObject.Filter = Array("user")
For Each oUser in oObject
oUser.Put "st","Beşiktaş"
oUser.Put "streetAddress","Barbaros Blv. No:9"
oUser.Put "postalCode","80690"
oUser.Put "l","Beşiktaş"
oUser.SetInfo
Next
End Sub

Gidip Active Directory Users and Computers içerisinden baktığınızda aşağıdaki gibi oluştuğunu göreceksiniz.

VBScript Kullanarak Objeleri Export Etmek

Bu örnekte, VBScript kullanarak Satis OU’su içerisindeki bütün kullanıcı hesapları ve bunların niteliklerini bir text dosyaya listelemeyi göreceksiniz.

NotePad’i açın ve aşağıdaki kodu yazıp, RaporAl.vbs adı ile kaydedin ve çalıştırın.

Dim OutPutFile
Dim FileSystemSet oRoot = GetObject("LDAP://rootDSE")
Set oDomain = GetObject("LDAP://ou=satis," & oRoot.Get("defaultNamingContext"))
Set objRootDSE = GetObject("LDAP://rootDSE")
Set FileSystem = WScript.CreateObject("Scripting.FileSystemObject")
Set OutPutFile = FileSystem.CreateTextFile("c:\rapor.txt", True)
EnumerateUsers
oDomainOutPutFile.Close
Set FileSystem = NothingSet
oDomain = Nothing 'oDomain değişkenini siliyor.
WScript.Echo "Tamamlandı"
WScript.Quit(0)
Sub EnumerateUsers(oCont)
Dim oUser
For Each oUser In oCont
Select Case LCase(oUser.Class)
Case "user"
If Not IsEmpty(oUser.distinguishedName) Then
OutPutFile.WriteLine "dn: " & oUser.distinguishedName
End If
If Not IsEmpty(oUser.name) Then
OutPutFile.WriteLine "name: " & oUser.Get ("name")
End If
If Not IsEmpty(oUser.st) Then
OutPutFile.WriteLine "st: " & oUser.st
End If
If Not IsEmpty(oUser.streetAddress) Then
OutPutFile.WriteLine "streetAddress: " & oUser.streetAddress
End If
Case "organizationalunit" , "container"
EnumerateUsers oUser
End Select
OutPutFile.WriteLine
Next
End Sub


WSH Kullanarak Grup Hesabı Oluşturmak

Set oRoot = GetObject(ldap://rootDSE/)
Set oDomain = GetObject("LDAP://" & oRoot.Get("defaultNamingContext"))
Set oGroup = oDomain.Create("Group", "cn=Patronlar")
oGroup.Put "sAMAccountName", " Patronlar "
oGroup.SetInfo
Wscript.Echo " Tebrikler Basariyla tamamlandi”

Yukarıdaki script kodunu yazıp çalıştırdıktan sonra bulunduğunuz domain altında Patronlar isimli bir grup açar.

Script İle Bilgi Toplama:

Kullanıcı adını , bilgisayar adını ve çalıştığınız domain adını veren script:

Set ad = WScript.CreateObject("WScript.Network")
WScript.Echo "Computer Name = " & ad.ComputerName & VBCrLf _& "User Name = " & ad.UserName & VBCrLf & "Domain = " & ad.UserDomain

Not 1: VBCrLf alt satıra geçmeyi sağlar.
Not 2: Alt çizgi (Underscore(_)) kod yarıda kalınca ikinci satırdan devam etmeyi sağlar.

1 yorum:

Uğur ERHAL dedi ki...

kaynak anlatamam tsk ederım :D