Windows - ADSI szkriptek készítése

ADSI 6. rész

forráskód letöltése
Cikksorozatunk eddigi részeiben számos szkriptet készítettünk. Néha különbözőt munkacsoportos és tartományi környezetek számára. Egy valamit viszont nem tettünk meg: soha nem ellenőriztük, hogy valóban sikeres volt a szkript által elvégzendő művelet. Magyarul nem volt hibakezelés. Hiánypótlásul jelen részben megnézzük, milyen hibakezelési lehetőségek állnak rendelkezésünkre az ADSI (Active Directory Service Interface) szkriptekben.
Cikkünkhöz mellékeltünk egy hibakeresést megvalósító szkriptet "ErrorHandling.vbs" néven. Felhasználása előtt az első sorában lévő "Computer" változó tartalmát módosítani kell egy valós számítógépnévre. A szkript létrehoz egy új felhasználói fiókot "Teszt" néven és kezeli a közben keletkező hibákat (például ha már létezik a fiók).
Az ADSI szkriptek is a WSH (Windows Scripting Host) rendszerén keresztül futnak, mely online hibafeldolgozást valósít meg. Ez annyit jelent, hogy a szkript futtatása közben ellenőrzi a forráskód szintaktikai helyességét, ellentétben például a Delphi-vel, mely a forráskódot lefordítja futtatható formátumra és a fordítás közben végez ellenőrzést. Továbbá előfordulhatnak nem szintaktikai eredetű hibák: például egy távoli gép eléréséhez nem rendelkezünk megfelelő szintű jogosultsággal vagy létre akarunk hozni egy már létező felhasználói fiókot. Ha hiba lép fel a WSH megszakítja a szkript futtatását és egy hibaüzenetet jelenít meg a képernyőn. Mi ezzel a probléma? Pont az, hogy megszakad a szkript futtatása és már nem is folytatható, pedig lehet, hogy elég lenne egy egyszerű hibaüzenetet megjeleníteni és ennek megfelelően minden mehetne tovább. A szkripten belül megvalósított hibakezeléshez nem kapunk sok támogatást, így sok mindent le kell programozni, ami egy bonyolultabb feladatot megvalósító, sok forráskódból álló program esetében sok többletmunkával jár. Mentségére legyen mondva, hogy az ADSI és általában a WSH adminisztrációs célokra készült segédeszköz és nem programfejlesztő környezet.
Létezik egy "On Error Resume Next" parancs, melyet az első sorok valamelyikében szoktak elhelyezni. Feladata utasítani a WSH-t, hogy ne foglalkozzon a futás közben keletkező hibákkal. Ha például megpróbálunk létrehozni egy már meglévő felhasználói fiókot és elhelyezzük a fenti sort a szkript elején, akkor gond nélkül lefut és látszólag nem történik semmi. A közben keletkezett hiba mintha egy fekete lyukba kerülne - nincs sehol. Ez az egyetlen lehetőségünk a hibakezelés megvalósítására, mert ilyenkor valójában nem tűnik el, csak nem jelenik meg a képernyőn. Szkripten belül viszont lekezelhető.
Kicsit bonyolítja a helyzetet, hogy minden ponton, ahol hiba fordulhat elő, nekünk kell kézzel megvalósítanunk a hibakezelést. Méghozzá úgy, hogy az "Err" nevű beépített változó értékét kell ellenőrizni. Ha nulla, akkor minden rendben volt, ha nem, akkor hiba keletkezett. Mindez lényegesen szemléletesebb egy próba szkripten keresztül bemutatva:
Készítünk egy szkriptet, mely létrehoz egy új felhasználói fiókot "Teszt" néven és lekezeljük az esetleg keletkező hibákat. Mik lehetnek ezek? Példánkban hármat különböztetünk meg (természetesen többet is lehet). Az első nem nevezhető hibának inkább eseménynek. Ennek ellenére írja az "Err" változó tartalmát:
  • Minden rendben zajlott, nem keletkezett hiba: "Err" = 0.
  • A létrehozandó fiók már létezik: "Err" = H800708B0.
  • Egyéb hiba keletkezett (pl.: nem megfelelő jogosultság, elérhetetlen számítógép, stb.): "Err" <> 0 és "Err" <> H800708B0.
Adjuk meg a számítógép nevét, melyen létre akarjuk hozni az új fiókot.
computer = "dorothy"
Tiltsuk le a hibaüzenetek képernyőn való megjelenítését, ami teljesen megszakítaná a programok futtatását.
On Error Resume Next
Hozzunk létre egy új felhasználói fiókot (lásd cikksorozatunk korábbi részeit).
Set myComputer = GetObject("WinNT://" & Computer)
Set newUser = myComputer.Create("user", "Teszt")
newUser.SetInfo
Létrehozás után ellenőrizzük az "Err" változó tartalmát. Ha eltér nullától, akkor meghívjuk az "AdsiErr()" nevű hibakezelő szubrutinunkat. Ellenkező esetben kiíratjuk a képernyőre: "Minden rendben.".
If Err Then 
  AdsiErr()
 Else
  Wscript.echo "Minden rendben."
End if
Ha nem volt hiba, ezen a ponton befejeződik a futás. Egyébként elindul az alábbi szubrutin.
Sub AdsiErr()
Ha az "Err" változó tartalma: "H800708B0", akkor egy már létező objektumot kíséreltünk meg létrehozni. Írassunk a képernyőre egy ennek megfelelő hibaüzenetet.
    If Err.Number = &H800708B0 Then
        WScript.Echo "A fiók már létezik."
    Else
Ha más a hibakód, akkor valamilyen egyéb hiba történt. Ebben az esetben megjelenítjük a "Váratlan hiba" üzenetet és mellette a hiba kódját (hexadecimálisan és decimálisan is), amit az "Err.Number" tulajdonság szolgáltat.
        e = Hex(Err.Number)
        WScript.Echo "Váratlan hiba: " & e & "(" & Err.Number & ")"
    End If
Majd befejeztetjük a szkript futtatását, de ezt nem kötelező megtenni. Akár folytathatjuk egy másik feladat végrehajtásával vagy bekérhetünk egy másik felhasználói nevet, stb.
   WScript.Quit(1)
End Sub
ADSI specifikus hibák
Onnan tudjuk, hogy kifejezetten az ADSI által szolgáltatott hibáról van szó, hogy a hexadecimális hibakód így kezdődik:
&H80005xxx
Az xxx helyén három egyjegyű szám áll.
Nem ADSI specifikus hibák
Egy általános Win32 hibakód így néz ki:
&H8007xxxx
Részletesebb információt parancssorból a következő utasítás kiadásával kapunk:
net helpmsg xxxx
Ahol az xxxx megegyezik a hibakód utolsó négy karakterével.
Például a 0000-hoz a "The operation completed successfully." üzenet tartozik.
Segítséget jelenthet a kódok meghatározásában, ha ideiglenesen kiiktatjuk a hibakezelést és hagyjuk, hogy a WSH végezze el, megszakítva a futtatást. Ekkor ugyanis megjelenik a kód és egy üzenet is, amiből a legtöbb esetben már lehet következtetni a hiba okára.

ADSI cikksorozat