Windows - ADSI szkriptek készítése

ADSI 3. rész

forráskód letöltése
Az előző részekben megismerkedtünk az ADSI (Active Directory Service Interface) szkriptek készítésének alapjaival és megtanultuk, hogy lehet elérni az objektumokat és lekérdezni a tulajdonságaikat. Ma tovább megyünk és megnézzük, milyen metódusokat lehet alkalmazni, egyúttal megtanuljuk a tulajdonságok módosítását is. Mindezt a szokott módon, gyakorlati példákon keresztül, mindenhol magyarázatokkal ellátva.
A mellékelt példák felhasználásához:
"GetTelNumbers.vbs" - Megjeleníti a "Rendszergazda" fiókhoz tartozó telefonszámokat a megadott tartományban.
"GetTelNumbers.bat" - Elindítja a "GetTelNumbers.vbs" szkriptet.
"SetUserFullName.vbs" és "SetUserFullName2.vbs" - A "Rendszergazda" fiók teljes nevét "WSO próbá"-ra módosítják. A két szkript között egyetlen programozás-technikai különbség van.
"GetUserFullName.vbs" - Lekérdezi és megjeleníti a képernyőn a "Rendszergazda" fiókhoz tartozó teljes név tulajdonságot.
A szkriptek felhasználása előtt az első sorokban lévő változókat (Computer, Domain, stb.) a helyi adottságoknak megfelelően módosítani kell.
Metódusok használata
ADSI szkriptekben a következő metódusok vehetők igénybe:
  • Get = Egy tulajdonság értékét adja vissza.
  • GetEx = Tulajdonság értékek egy tömbjét adja vissza.
  • Put = Beállít egy tulajdonság értéket.
  • PutEx = Beállít, töröl, eltávolít vagy hozzáfűz egy értéket egy tulajdonság tömbhöz.
  • GetInfo = Kiolvassa az adott értéket a címtárszolgáltatásból és elhelyezi a helyi gyorsítótárban.
  • GetInfoEx = Kiolvassa egy meghatározott objektumtípus adott értékeit a címtárszolgáltatásból és elhelyezi a helyi gyorsítótárban.
  • SetInfo = Elmenti a tulajdonságon végzett változtatásokat (a Get metódussal együtt használandó).
Az előző részben egy példán keresztül megmutattuk, hogy lehet egy felhasználó teljes nevét (full name) kiolvasni. Akkor közvetlenül hivatkoztunk az objektum tulajdonságára (objektum.tulajdonság formában). Most nézzünk meg ugyanerre egy másik módszert, a Get metódus használatát:
Eltároljuk a felhasználó bejelentkezési nevét és annak a gépnek a nevét, mely az adatait tárolja - egy-egy változóba.
Username = "rendszergazda"
Computer = "dorothy"
Létrehozunk egy kapcsolatot a felhasználói fiók objektummal.
Set myObj = GetObject("WinNT://" & Computer & "/" & UserName & ",user")
Eddig minden ugyanúgy történt, mint az előző szkriptben. Most viszont nem közvetlenül fogunk az objektum tulajdonságára hivatkozni, hanem a Get metóduson keresztül. Paraméterként a kiolvasandó tulajdonságot kell átadni. A visszatérési értéket az "FName" változóban tároljuk el.
FName = myObj.Get("FullName")
Végül a változó tartalmát megjelenítjük a képernyőn.
WScript.Echo "A felhasználó teljes neve: " & FName
Tulajdonságok értékeinek módosítása
A lekérdezéshez hasonlóan két módszer létezik a tulajdonságok beállítására. Kezdjük a metódus használattal: módosítsuk az egyik felhasználó teljes nevét "WSO próbá"-ra.
Létrehozzuk a már jól ismert változóinkat és kapcsolatot teremtünk a felhasználói objektummal.
Username = "rendszergazda"
Computer = "dorothy"
Set myObj = GetObject("WinNT://" & Computer & "/" & UserName & ",user")
Ezt követően a "Put" metódusra lesz szükség. Két paramétert kell átadni: az első a módosítandó tulajdonság, a második az új érték.
myObj.Put "FullName", "WSO próba"
Ezzel még ténylegesen nem változtattunk semmit. Meg kell hívni a "SetInfo" metódust a véglegesítéshez. Leginkább ahhoz lehetne hasonlítani, mint amikor egy ablak tartalmát szerkesztjük, de a változtatások csak az "OK" gomb lenyomása után érvényesülnek.
myObj.SetInfo
WScript.Echo "A névváltoztatás kész."
A következő módszer a tulajdonság közvetlen szerkesztése a "Put" metódus nélkül. Fontos, hogy a "SetInfo"-ra ebben az esetben is szükség van.
Username = "rendszergazda"
Computer = "dorothy"
Set myObj = GetObject("WinNT://" & Computer & "/" & UserName & ",user")
myObj.FullName = "WSO próba2"
myObj.SetInfo
WScript.Echo "A névváltoztatás kész."
Helyi gyorsítótár használata
Elkerülendő a lassú hálózati kapcsolatok okozta lassú program futásokat az ADSI fenntart egy helyi gyorsítótárat, melyben az objektumok lekérdezések eredményeit tárolja. Az első alkalommal, amikor lekérdezzük egy objektum valamely tulajdonságát, automatikusan az összes tulajdonság bekerül a helyi tárba. Legközelebbi alkalommal egy másik tulajdonság lekérdezésekor már innen olvassa ki, ami lényegesen meggyorsítja a szkriptek futtatását. Előfordulhat, hogy az adatot egy másik gép már módosította és így különbözik a helyi tárban tárolt információ a ténylegestől. A probléma elhárítható a gyorsítótár explicit módon történő frissítésével. Erre szolgál a "GetInfo" metódus. Például:
myObj.GetInfo
Csoportos tulajdonságok lekérdezése
Vannak tulajdonságok melyek több tulajdonságból állnak. Tipikusan ilyen az Active Directory címtárban a felhasználókhoz rendelt telefonszám. Egy tulajdonsághoz több érték tartozik. Nyissuk meg egy tartományvezérlőn a Felügyeleti eszközök > Active Directory - felhasználók és számítógépek (Administrative Tools > Active Directory Users and Computers) konzolt, majd egy felhasználó tulajdonságlapját. Az "Általános" ("General") oldalon található egy "Telefonszám" ("Telephone number") mező. Kattintsunk a mellette lévő "Egyéb" ("Other") gombra. Itt lehet további telefonszámokat megadni. Csak egy objektum tulajdonság létezik "otherTelephone" néven - mintegy tömbszerűen - és több értéke van. Vajon hogy lehet kiolvasni őket? A "GetEx" metódussal. Nézzük meg az alábbi szkriptet:
Szokásunkhoz híven a szkript elején változókban tároljuk az objektum eléréshez szükséges adatokat. Szükségünk van a felhasználó nevére (Username) és az egyik tartományvezérlőre (Computer). A tartomány nevét annyi részre bontottuk, ahányból áll. Példánkban a microsoft.com-ot alkalmazzuk, így két "Domain" változót vezetünk be.
Username = "rendszergazda"
Computer = "kentaur"
domain1 = "microsoft"
domain2 = "com"
Megjelenítünk egy fejlécet:
WScript.Echo "A(z) " & Username & " felhasználó telefonszámai:"
WScript.Echo
Ezúttal nem a WinNT szolgáltatóval kapcsolódunk az objektumhoz, hanem az LDAP-val. Címtárrendszerekben sokszor célszerűbb és van, ahol csak ezt lehet használni. Az Active Directory teljeskörű támogatást nyújt hozzá. Ismernünk kell az LDAP szintaxist, melyről már korábbi cikkeinkben többször volt szó (lásd a kapcsolódó témaköröket).
Set myObj = GetObject("LDAP://" & Computer & "/CN=" & Username & " ,CN=Users,DC=" & Domain1 & " ,DC=" & domain2)
Lekérjük a "GetEx" metódus segítségével az "otherTelephone" tulajdonságot (használata megegyezik a "Get" metóduséval). A kapott eredményt egy ciklussal megjelenítjük a monitoron.
homePhones = myObj.GetEx("otherTelephone")
 for each phone in homePhones
   WScript.Echo phone
 next
Csoportos tulajdonságok módosítása
Lényegében ugyanúgy kell elkészíteni, mint az előző szkriptet csak a "PutEx" metódust kell alkalmazni. Néhány példán keresztül érthetővé válik a használata:
myObj.PutEx ADS_PROPERTY_APPEND, "OtherhomePhone", Array("111-1111")  
myObj.SetInfo 
myObj.PutEx ADS_PROPERTY_DELETE, "OtherHomePhone", Array("111-1111", "222-2222")
myObj.SetInfo
myObj.PutEx ADS_PROPERTY_UPDATE, "OtherHomePhone", Array("888-8888", "999-9999")
myObj.SetInfo
myObj.PutEx ADS_PROPERTY_CLEAR, "OtherHomePhone",  vbNull
myObj.SetInfo
Az ADS_X kapcsolókkal szabályozhatjuk, hogy a meglévő adatokhoz hogy kapcsolódjanak az újak.

ADSI cikksorozat