Windows - ADSI szkriptek készítése

ADSI 5. rész

forráskód letöltése
A legutóbbi részben a felhasználói fiókok kezeléséről volt szó. Ma a felhasználói csoportokat vesszük sorra: megnézzük, hogy lehet listázni, létrehozni és törölni őket, munkacsoportos és tartományi környezetben egyaránt. Végül két példán keresztül felhasználót rendelünk egy csoportba, majd eltávolítjuk onnan. Mindezt az ADSI (Active Directory Service Interface) által szolgáltatott lehetőségekkel.
A mellékelt példák használatához:
"ListGroups.vbs" - Tartományi környezetben kilistázza a képernyőre a felhasználókat. Indítását a "ListGroups.bat" batchfájllal hajtsuk végre.
"ListGroups.bat" - Elindítja a "ListGroups.vbs" szkriptet.
"ListWGGroups.vbs" - Munkacsoportos környezetben listázza ki a felhasználókat. Indítását a "ListWGGroups.bat" batchfájllal hajtsuk végre.
"ListWGGroups.bat" - Elindítja a "ListWGGroups.vbs" szkriptet.
"CreateGroup.vbs" - Létrehoz egy "Teszt" nevű csoportot a megadott tartományban.
"CreateWGGroup.vbs" - Létrehoz egy "Teszt" nevű csoportot a megadott munkacsoportban.
"DeleteGroup.vbs" - Törli az előbb létrehozott tartományi csoportot.
"AddUserToGroup.vbs" - Hozzáadja a "Teszt" nevű felhasználót az "Administrators" csoporthoz.
"RemoveUserFromGroup.vbs" - Eltávolítja a "Teszt" nevű felhasználót az "Administrators" csoportból.
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.
Csoportok listázása
Annak érdekében, hogy ismét változtassunk egy kicsit a szkriptek létrehozásának technikáján, megint másként közelítünk a megoldáshoz, mint a korábbiakban és különbséget teszünk a munkacsoportok illetve tartományok között. Eddig minden esetben tartomány és tartományvezérlő nevet is megadtunk az objektumhivatkozásoknál (munkacsoportoknál szintén). Most megnézzük azt a lehetőséget is, amikor kihagyjuk a számítógép nevét és csak a tartomány névterére hivatkozva futtatjuk a szkriptet. Ilyenkor az a tartományvezérlő fogja kiszolgálni kérésünket, mely leghamarabb kapja meg.
Írjuk be a "Domain" változóba a tartomány teljes nevét.
Domain = "microsoft.com"
Az ADSI objektumhivatkozásnál a "WinNT" ellátó után csupán ezt a nevet adjuk meg és ne pontosítsuk tovább az elérési utat.
Set myDomain = GetObject("WinNT://" & Domain)
Szűrjük meg a kapott eredményt a már ismer módon úgy, hogy csak a "group" osztályba tartozó objektumok maradjanak.
myDomain.Filter = Array("group")
Dolgozzuk fel a maradék adatokat: jelenítsük meg a képernyőn a csoportok nevét (name tulajdonság).
For Each group In myDomain
    WScript.Echo group.Name
Next
Sajnos a módszer egy munkacsoport esetében nem működik, így ott megmaradunk a "WinNT://munkacsoport/gépnév" elérési formulánál. Vajon miért nem működik? Mert hiányzik a tartományokban meglévő központi nyilvántartás (címtár rendszer). Azzal, hogy egy munkacsoportban létre akarunk hozni valamit még nem mondtuk meg, hogy az konkrétan melyik gépen történjen - a keresésekre ugyanez vonatkozik. Ha az egyiken megtesszük, nem kerül át automatikusan egy másikra, ellentétben a tartomány központosított - egy helyen adminisztrálható - felépítésével, ahol gyakorlatilag mindegy, hogy melyik gépen ténykedünk, lényegében a tartományvezérlőt használjuk.
Adjuk meg a "Workgroup" változóba az elérendő munkacsoport nevét, majd a "Computer" változóba annak a számítógépnek a nevét, mely felhasználói csoportjait listázni szeretnénk.
Workgroup = "workgroup"
Computer = "dorothy"
A fenti adatok felhasználásával kapcsolódjunk a "WinNT" ellátón keresztül az adott géphez.
Set myDomain = GetObject("WinNT://" & Workgroup & "/" & Computer)
Szűrjük meg a visszakapott értéket, hogy csak a csoportokat jelentő objektumokat lássuk.
myDomain.Filter = Array("group")
Jelenítsük meg a megmaradt adatokat a képernyőn egy ciklussal végighaladva az összes elemen.
For Each group In myDomain
    WScript.Echo group.Name
Next
Csoport létrehozása
Ismét különbséget teszünk a tartományi és a munkacsoportos létrehozás között, bár az utóbbi módszer működik az előbbiben is.
Nézzük elsőként a tartományi csoportok készítését.
Adjuk meg annak a tartománynak a nevét, ahol az új csoportot létre akarjuk hozni (Domain). Minimális adatként még meg kell adni a csoport nevét (sGroupName). Nem kötelező bár megadtuk a leírás tulajdonságot is (sDescription).
Domain = "microsoft.com"
sGroupName = "Teszt"
sDescription = "Windows Software Online"
Kapcsolódjunk a változóban szereplő tartományhoz az ADSI interfész segítségével a "WinNT" szolgáltatón keresztül. Kérésünket a legkevésbé foglalt - elsőként elérhető tartományvezérlő fogja kiszolgálni.
Set myComputer = GetObject("WinNT://" & Domain)
Létrehozunk egy új objektumot a "Create" metódussal. Típusa: "group", neve pedig az "sGroupName" változó értéke. Opcionálisan beállítjuk a Description tulajdonságot is.
Set newGroup = myComputer.Create("group", sGroupName)
newGroup.Description = sDescription
A létrehozás folyamata csak a "SetInfo" metódus futtatása után történik meg ténylegesen, így most ez következik.
newGroup.SetInfo
Jelezve a felhasználó felé, hogy véget ért a szkript futása, megjelenítünk egy rövid szöveget.
Wscript.Echo "Kész..."
Ha készítünk egy tartományban egy új csoport objektumot, joggal merülhet fel a kérdés, hogy vajon a címtár melyik tárolójában jön létre? Ott, ahol alapértelmezésben a többi is szerepel a "Users" tárolóban.
Ugyanez munkacsoportos környezetben annyival módosul, hogy meg kell adnunk egy gépet, amelyiken létrejön a csoport. Az ok ugyanaz, mint a listázásnál említett: nincs központi nyilvántartó rendszer, mely eljuttatja mindenhova az információt.
Használhatjuk az előző szkriptet, de az ADSI elérési utat kibővítjük a számítógép nevével (Computer).
Computer = "dorothy"
sGroupName =    "Teszt"
sDescription = "Windows Software Online"
Set myComputer = GetObject("WinNT://" & Computer)
Set newGroup = myComputer.Create("group", sGroupName)
newGroup.Description = sDescription
newGroup.SetInfo
Wscript.Echo "Kész..."
Csoport törlése
Egyszerűsítsük le a törlést, amennyire csak lehet. Ha megadunk egy számítógépet, akkor mindegy, hogy tartományról vagy munkacsoportról van szó, a feladat végrehajtódik. Nem teszünk mást, mint a "WinNT" ellátón keresztül kapcsolódunk a "Computer" változóban lévő géphez és meghívjuk csoport (group) objektum "Delete" metódusát. Paraméterként a törlendő csoport nevét kell hozzáfűzni.
Computer = "dorothy"
sGroupName = "Teszt" 
Set myComputer = GetObject("WinNT://" & Computer)
myComputer.Delete "group", sGroupName
Wscript.Echo "Kész..."
Felhasználók hozzáadása csoportokhoz
Szkriptünk működésének feltétele, hogy létező felhasználói fiókot rendeljünk létező csoporthoz. Ellenkező esetben hibajelzést kapunk.
Computer = "dorothy"
sGroup = "Administrators"
User = "Teszt"
Először kapcsolatot teremtünk a csoport, utána a felhasználói objektummal.
Set myGroup = GetObject("WinNT://" & Computer & "/" & sGroup & ",group")
Set myUser = GetObject("WinNT://" & Computer & "/" & User & ",user")
Majd a kettőt összekapcsoljuk az "Add" metódussal.
myGroup.Add(myUser.ADsPath)
Befejezésül jön a már ismert üzenet.
Wscript.Echo "Kész..."
Felhasználók eltávolítása csoportból
Utolsó szkriptünk annyiban különbözik az előzőtől, hogy nem az "Add", hanem a "Remove" metódust kell használni.
Computer = "dorothy"
sGroup = "Administrators"
User = "Teszt"
Set myGroup = GetObject("WinNT://" & Computer & "/" & sGroup & ",group")
Set myUser = GetObject("WinNT://" & Computer & "/" & User & ",user")
myGroup.Remove(myUser.ADsPath)
Wscript.Echo "Kész..."

ADSI cikksorozat