Windows - ADSI szkriptek készítése

ADSI 8. rész

forráskód letöltése
Folytatjuk az ADSI-ről (Active Directory Service Interface) szóló cikksorozatunkat. Az előző részben már kifejezetten Active Directory specifikus feladatokat végeztünk el, míg korábban munkacsoportos környezetben is alkalmazható szkriptek készítését mutattuk be. Ma ismét egy Active Directory-s témát érintünk: megnézzük, hogy lehet az LDAP lekérdezésekben SQL szintaxis szerinti feltételeket megadni és megvalósítunk egy keresést a teljes címtárban.
Mellékeltük az alábbiakban tárgyalásra kerülő szkriptet "Search.vbs" néven. Felhasználása előtt módosítani kell a benne foglalt zp.local tartománynevet, egy valós tartományt megadva.
Hogy lehetne szkriptek segítségével megkeresni egy adott feltételeknek megfelelő objektumot (például egy felhasználói fiókot) a címtárban? Amíg egy szervezeti egységben található az összes objektum, addig egy ciklussal végignézhetjük őket és kilistázzuk a feltételeknek megfelelőt. De az Active Directory címtárának hierarchikus felépítése pont azért készült, hogy a bonyolultabb szervezeteket is áttekinthetően lehessen ábrázolni. Sőt a kevésbé bonyolult szervezeteknél is javasolt a címtár nyújtotta csoportosítási lehetőségek kihasználása. Így viszont már nagyon nehéz keresni.
A probléma áthidalásában segítséget kapunk az ADSI-től: képes más szolgáltatásokra támaszkodva kihasználni annak képességeit. A kereséseknél a Microsoft ActiveX Data Objects (ADO) jelenti az alapot. Alapvetően az ADO három komponensének elérésére van szükség: Connection (a kapcsolatteremtéshez), Command (a keresési sztring átadásához) és RecordSet (a visszakapott eredmény tárolásához).
Az ADSI kétféle módszert (dialektust) ismert a keresési kifejezés megadásában: LDAP és SQL. Nézzünk egy példát az LDAP-ra:
Com.CommandText = "<LDAP://DC = zp,  DC = local>;(& (objectCategory = Person) (objectClass = user) (description = Programozó);name, telephoneNumber; subTree"
A keresési feltétel lekéri az összes felhasználó nevét és telefonszámát a zp.local tartományban, ahol a felhasználó leírása (description): "programozó". A keresés kiindulópontja a tartomány gyökere és az összes tárolóban zajlik (subTree).
Az SQL szintaxis szerinti keresés valószínűleg többek által ismert, ezért egy konkrét példán keresztül mutatjuk be. Készítünk egy szkriptet, mely megvalósítja a fenti LDAP módszert, SQL-ben.
Kapcsolatot kell teremtenünk (Connection) az ADO szolgáltatással és definiálnunk kell egy parancsobjektumot (Command), melyen keresztül a keresési feltételeket adjuk át.
Set con = CreateObject("ADODB.Connection")
Set com = CreateObject("ADODB.Command")
A kapcsolat kialakítása és megnyitása az "ADsDSOObject" objektumon keresztül lehetséges.
con.Provider = "ADsDSOObject"
con.Open "Active Directory Provider"
Set Com.ActiveConnection = con
A "CommandText" tulajdonság egy sztringet takar. Ebben lehet megadni a keresési feltételt. Tulajdonképpen szabályos SQL lekérdezést hajtunk végre, csak a szokásos adatbázis hivatkozások helyett a tartományra hivatkozunk ("LDAP://DC=zp, DC=local"). Ettől kezdve a tartományi objektumok tulajdonságait ugyanúgy kezeljük, mint az adatbázis mezőket.
Ha nem akarunk az egész tartományban keresni, akkor adjunk meg például egy szervezeti egységet kiindulópontnak (pl.: "LDAP://OU=wso, DC=zp, DC=local").
com.CommandText = "select name,telephoneNumber from 'LDAP://DC=zp, DC=local' WHERE objectCategory='Person' AND objectClass='user'AND description='Programozó'"
Az "Execute" metódussal futtatjuk az adatkapcsolaton keresztül a megadott feltételek szerinti keresést.
Set rs = Com.Execute
A visszakapott eredmény (rs = RecordSet) feldolgozása egy ciklussal a legegyszerűbb. Semmi akadálya, hogy fájlba vagy másik adatbázisba mentsük, mi most történetesen a képernyőn jelenítjük meg.
While Not rs.EOF
  Wscript.echo rs.Fields("Name") & " , " & rs.Fields("telephoneNumber")
    rs.MoveNext
Wend

ADSI cikksorozat