Terminál szerver átállás – melléktermék

Megritkultak a bejegyzéseim kissé, nézzétek el nekem, a hétvégén Terminál szerver frissítést végzünk, fontos időpont ez a MAL IT történetében. Nem csak az Windows verziójának váltásáról van szó, az talán a legcsekélyebb újdonság. Ami gyökereses más lesz, az a terminál kiszolgálók és a felhasználók kapcsolata. Ha minden jól megy, akkor végképp megszabadulunk a korábban már elpanaszolt profil problémáktól. Ennél is nagyobb dobás azonban, hogy egy egész telephely mind a huszonhárom felhasználóját "vékonyklienssé" változtatjuk. Ennek a műveletnek két fázisa lesz. Az első fázisban még a PC-iket használják, de már csak a belépéshez, utána rögtön TS munkamenetet indítanak. Később – áprilisban – megkapják az igazi vékonyklienseket is.

Hogy a fenti művelet sikerüljön, át kell migrálnunk az adataikat (amúgy is vonalon keresztül mentjük őket) és lehetővé kell tennünk, hogy az új TS profiljuk minél nagyobb hányada azonnal használható legyen. Ez utóbbi feladatcsoporthoz tartozik a nyomtató-csatlakozások helyreállítása. Könnyű dolgunk van abban a tekintetben, hogy az egész telephely csupán egy nagyobbacska villa három szinttel, s öszesen négy hálózati nyomtatója van a csapatnak, ami még a tavalyi nyomtató-racionalizálásnak köszönhető. Nos, a kihívás a következő: bejelentkezéskor állapítsa meg egy script, hogy a felhasználó a szóbanforgó telephelyhez tartozik-e, ha igen, akkor nézze meg, hogy csatlakozott-e már ahhoz a négy hálózati nyomtatóhoz, s ha nem, akkor csatlakoztassa. (Egyéb "IF" ágak szintén lerendezendők). Tegnapra – végül is a TS átállás melléktermékeként – elkészült a script, amelyet most kommentezve megosztok veletek. (Nem vagyok egy nagy sciptíró, talán ezért is örülök most magamnak.) Tehát a szülemény:

Bevezető

Mindjárt az elején kikapcsoltam a hibajelzést  – ez mégis csak egy logon script, ha nem működik akkor se "sírjon". Aztán definiáltam két tömböt, amelyekre szükség lesz (és nem definiáltam a többi változót, hja a lusta rendszergazdája  )

Ezután feltöltöttem a tömböket, az elsőt az elérhető nyomtatókkal, a másodikat pedig LDAP elérési útvonal-darabkákkal. Ezeken az elérési utakon találhatók felhasználói fiókok, így szükség lesz rájuk.

 

On Error Resume Next

 

Dim aLDAPPaths(5), SrvAndPrinter(20)

 

Const E_ADS_PROPERTY_NOT_FOUND  = &h8000500D

 

‘ ************** Tömbök feltöltése ***********************

 

 SrvAndPrinter(0) = "\SRV1MXRXM20-001"

 SrvAndPrinter(1) = "\SRV1MXRX-02"

 SrvAndPrinter(2) = "\SRV1MXRXM24-001"

 SrvAndPrinter(3) = "\SRV1MXRX128-001"

 SrvAndPrinter(4) = "\SRV1MHPLJ1300-02"

 

 SrvAndPrinter(5) = "\SRV1XRXM20-001"

 SrvAndPrinter(6) = "\SRV1XRXM24-001"

 SrvAndPrinter(7) = "\SRV1XRXM24-002"

 SrvAndPrinter(8) = "\SRV1XRXM55-001"

 

 SrvAndPrinter(9) = "\SRV2HPInk1700-01"

SrvAndPrinter(10) = "\SRV2HPInk1700-02"

SrvAndPrinter(11) = "\SRV2HPLJ1200N-01"

SrvAndPrinter(12) = "\SRV2HPLJ1200N-01"

SrvAndPrinter(13) = "\SRV2HPLJ4000N-01"

SrvAndPrinter(14) = "\SRV2HPLJ4-01"

SrvAndPrinter(15) = "\SRV2HPLJ4200DTN-01"

SrvAndPrinter(16) = "\SRV2HPLJ4250TN-01"

 

SrvAndPrinter(17) = "\SRV3XRXM20-001"

SrvAndPrinter(18) = "\SRV3XRXM24-001"

SrvAndPrinter(19) = "\SRV3XRXM24-002"

SrvAndPrinter(20) = "\SRV3XRXM55-001"

 

 

aLDAPPaths(0) = ",ou=USERS,"

aLDAPPaths(1) = ",ou=OTHERSITE-USERS,"

aLDAPPaths(2) = ",ou=COMMON,"

aLDAPPaths(3) = ",ou=OTHER,"

aLDAPPaths(4) = ",ou=TESTS,"

 

‘******************** Tömbök feltöltve **************************

 

 A bemelegítés után jöhet a progrmatörzs. Először is meg kell állapítani, hogy kivel van dolgunk. Erre a legegyszerűbb módszer a WScript.Network objektum. Ez ugyanazt adja vissza, mintha a %USERNANE% értéket kértük volna le. Ha megvan a felhasználónév, akkor már AD értékeket is kiolvashatunk. Mivel a username érték nem egyezik meg a "canonical name" mezővel, ezért WinNT-n keresztül nézzük a meg a user adatait

   

‘****************** Programtörzs *************************

 

Set objNetwork = CreateObject("WScript.Network")

NameOfCurrentUser = objNetwork.UserName

Set objUser = GetObject("WinNT://MAL/" & NameOfCurrentUser & ",user")

 

‘WScript.Echo "The User is: " & NameOfCurrentUser

 Az ellenőrző WScript.Echo sorokat benne hagytam, de kikommenteztem. Aki szeretné, az bekapcsolhatja. No, miután van egy felhasználói objektumunk, meg kellen állapítani, hogy hova valósi az illető. Erre a WinNT-s megközelítés nem tulságosan alkalmas, így csupán a CN értékét használjuk az objektumnak, majd ez alapján megpróbálunk LDAP provider-en keresztül is csatlakozni. Végig kell próbálnunk az összes olyan LDAP útvonalat, ahol ez a felhasználó előfordulhat. Nálunk öt ilyen OU van, tehát elkezdjük a fent feltöltött tömb elemeit próbálgatni. Ha nincs hiba, akkor sikeres az objektumhoz való csatlakozás.

 

i = 0

Do

 Err.Number = 0

 Set objLDAPUser = GetObject("LDAP://cn=" & objUser.FullName & aLDAPPaths(i) & "ou=OUNAME1,ou=OUNAME0,dc=domain,dc=hu")

 i = i+1

Loop Until Err.Number = 0 or i = 5

Az LDAP már alkalmas arra, hogy a fiók bármilyen tulajdonságát lekérdezhessük. Nálunk a telephelyi hovatartozást egy csoporttagság szimbolizálja, tehát a csoporttagság értéket kell kinyernünk. Ez egy többelemű tömb,  tehát a GetEx metódust kell alkalmaznunk. (Ezt a kódrészt "találtam") Miután kinyertük a tömböt, egyesével meg kell vizsgálnunk a tömbelemek értékét. Ha megtaláljuk, amit kerestünk (itt éppen háromféle csoport esetén találunk valamit), akkor meghatároztuk a felhasználó telephelyét, további keresésre nincs szükség, kiléphetünk.

 

arrMemberOf = objLDAPUser.GetEx("memberOf")

If Err.Number = E_ADS_PROPERTY_NOT_FOUND Then

            WScript.Echo "The memberOf attribute is not set"

Else

For each Group in arrMemberOf

 

            Select Case Group

 

                        Case "CN=Site-1,OU=GROUPS,ou=OUNAME0,dc=domain,dc=hu"

                        strUserSite = "SITE1"

 

                        Case "CN=Site-2,OU=GROUPS,ou=OUNAME0,dc=domain,dc=hu"

                        strUserSite = "SITE2"

 

                        Case "CN=Site-3,OU=GROUPS,ou=OUNAME0,dc=domain,dc=hu"

                        strUserSite = "SITE3"

                        Case Else

                        strUserSite = "Nem talált"

            End Select

 

            If strUserSite <> "Nem talált" Then

                        Exit For

            End If

Next

End If

 

‘ WScript.Echo "The user’s site is: " & strUserSite

Most már tudjuk, hogy kiről van szó, azt is, hogy milyen telephelyhez tartozik, következhet a nyomtató kiértékelés és szükség esetén csatlakoztatás.

 A nyomtatók listája egy collection, amit egy apró WMI Queary segítségével gyűjthetünk össze. Ha megvagyunk, akkor a telephely alapján elindítjuk a PrinterDetection szubrutint. A bemenő értékek a script elején feltöltött, nyomtatókat tartalmazó tömb tömbindexei. Az 5,8 például azt jelenti, hogy az 5-6-7-8 indexű nyomtatót keresi majd a script, és ha nem találja, akkor csatlakozik hozzá.

 

strComputer = "."

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\.rootcimv2")

Set colInstalledPrinters = objWMIService.ExecQuery("Select * from Win32_Printer")

 

Select Case strUserSite

 

            Case "SITE1"

                        Call PrinterDetection(5,8)

                                  

            Case "SITE2"

                        Call PrinterDetection(0,4)

                                  

            Case "SITE3"

                        Call PrinterDetection(9,16)

End Select

 

Itt vége is a programnak, csupán az egyetlen eljárást kell még ismertetnem. A módszer egyszer, két egymásba ágyazott ciklussal megoldható. Veszünk egy for ciklust, amely kezdeti tömbindextől, végső tömbindexig fut, majd megnézi, hogy az egyes tömbérték előfordul-e a WMI Query lekérdezéssel létrehozott collekcióban. Ha talál egyezőséget, akkor nem is vizsgálódik tovább, jöhet a következő külső for ciklus. Ha nem talál egyezőséget a teljes for each ciklus során, akkor az a nyomtató a felhasználónál nincs meg, tehát csatlakozni kell hozzá. Erre megint a WSH Network objektum egy metódusa a legmegfelelőbb.

 

‘*************** Szubrutinok ******************************

Sub PrinterDetection (iStart, iStop)

 

For iSubI = iStart to iStop

 

            strPrinterSetup = "Needed"

            For Each objPrinter in colInstalledPrinters

                WScript.echo SrvAndPrinter(iSubI) & "   szemben áll a  " & objPrinter.Name

                 If SrvAndPrinter(iSubI) = objPrinter.Name Then

                          StrPrintersetup = "Not Needed"

                           Exit For

                 End If

            Next

           

            If strPrinterSetup = "Needed" Then

                        Set oNetwork = CreateObject("WScript.Network")

                       WScript.Echo "Connecting to the printer… " & SrvAndPrinter(iSubI)

                        oNetwork.AddwindowsPrinterConnection(SrvAndPrinter(iSubI))

            End if

 Next

End Sub

‘************************ Szubrutinok vég**********************

 Hát ennyi. Még néhány apróság: a TS node-on előzetesen telepíteni kell a megfelelő nyomtatódrivert, különben a mutatvány nem sikerül. Hibaüzenet nem lesz, arról az "On error resume Next" gondoskodik.

 

Végülis, ha most belegondolok, ez az egész programocska egy kicsit az R2 féle nyomtatókiajánláshoz hasonlít. Ha egy nyomtató hiányzik, a script újracsatolja. Mint egy házirend. Aki akarja, használja egészséggel. Felelősséget és garanciát természetesen nem vállalok.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: