Windows - Számítógépek gyors csatlakoztatása tartományhoz

forráskód letöltése
Ha egy vállalat hálózatát átállítják Active Directory címtárra, nem csak a kiszolgálót kell módosítani, hanem a klienseket is át kell állítani. Minden egyes gépen meg kell változtatni a hálózati beállításokat és a munkacsoportot, tartományra módosítani. Ez minden esetben több egérkattintással, gépeléssel és végül egy újraindítással jár együtt. Minél több gépről van szó, annál hosszabb ideig tart és nem mindegy, hogy egy gépet mennyi idő alatt lehet csatlakoztatni. Cikkünkben bemutatjuk, hogy lehet egy egyszerű VBScript futtatásával jelentősen csökkenteni a csatlakozáshoz szükséges időt.
Cikkünkhöz mellékeltük az alábbiakban szereplő szkriptet "Join.vbs" néven. Egy Windows XP kliens gépen futtatva csatlakoztatja a gépet a megadott tartományhoz. Ehhez elsőként a szkript első sorába be kell írni a tartomány nevét, majd a második és harmadik sorba a művelet elvégzésére jogosult felhasználó nevét és jelszavát.
A szkriptet egy floppyn körbehordozva vagy egy hálózati megosztásba futtatva módosítja a hálózati beállításokat, átállítja a megadott tartományra, majd újraindítja a gépet. Tulajdonképpen elvégez mindet, amit ilyenkor a rendszergazda tesz, csupán futtatni kell. Fontos megemlíteni, hogy csak abban az esetben működik, ha a kliens gépen Windows XP operációs rendszer fut. Ennek az oka, hogy az XP-ben jelent meg a "Win32_ComputerSystem" osztályban a csatlakoztató metódus. Windows 2000 és korábbi rendszerekből ez hiányzik.
Lássuk neki a szkript ismertetésének:
Rögtön az elején változókban helyezztük el a csatlakozáshoz szükséges adatokat. Mik ezek?
  • tartománynév (strDomain)
  • csatlakoztatásra jogosult felhasználó neve (strUser)
  • csatlakoztatásra jogosult felhasználó jelszava (strPassword)
Zárójelben a változó nevét tüntettük fel, ez természetesen módosítható.
strDomain   = "microsoft"
strUser     = "rendszergazda"
strPassword = "abc123"
Szükségünk van a kliens számítógép nevére is, de sokkal elegánsabb, ha ezt már nem változóval adjuk meg, hanem kiolvastatjuk a WMI (Windows Managemenet Instrumentation) szolgáltatással. A szépségen kívül gyakorlati haszon, hogy nem kell minden kliensen módosítani a szkript tartalmát, hanem ugyanazt változatlanul futtathatjuk a hálózat összes gépén. A számítógép nevet a "WScript.Network" objektum "ComputerName" tulajdonságából tudjuk meg. Kiolvasás után tároljuk el az strComputer változóba.
Set objNetwork = CreateObject("WScript.Network")
strComputer = objNetwork.ComputerName
Most következik a fent említett "Win32_ComputerSystem" osztályhoz való csatlakozás a helyi gépen - amit az strComputer változó jelöl. Helyileg az alapértelmezett WMI névtérben (\root\cimv2) található. Mindez az aktuálisan bejelentkezett felhasználó adataival történjen (impersonationLevel = Impersonate).
Set objComputer = GetObject ("winmgmts:{impersonationLevel = Impersonate}!\\" & strComputer & "\root\cimv2:Win32_ComputerSystem.Name = '" & strComputer & "'")
A szkript eddig egy Windows 2000-es gépen is futna, mert minden rendelkezésre áll a WMI-ban, amit felhasználtunk. De csak eddig, ugyanis most fogjuk meghívni a Windows XP-től (a .NET szerverekben is megtalálható) meglévő "JoinDomainOrWorkGroup" metódust. Paraméterezése elég érdekesen alakul: meg kell adni a tartomány nevet, a jogosult felhasználó jelszavát, felhasználói nevét. Utóbbit tartomány\név formában. Az utolsó 3-as paraméter a cikk végén található táblázat konstansainak összege. Hogy melyik konstansoké az minden esetben az elvégzendő művelettől függ.
ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain,strPassword,strDomain & "\" & strUser, NULL, 3)
A kapott visszatérési értéket nem kezeljük le, mert minél gyorsabban végezni akarunk a csatlakoztatással. Ha nincs hálózati kapcsolat, akkor úgysem fog sikerülni és hibaüzenetet kapunk. Utolsó lépésként újra kell indítani a gépet, amit szintén a WMI szolgáltatással tehetünk meg. Meg kell hívni a "Win32_OperatingSystem" osztály "Reboot" metódusát.
Set Reboot = GetObject("winmgmts:{(Shutdown)}//./root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")
for each OpSys in Reboot
OpSys.Reboot()
next
A "JoinDomainOrWorkGroup" osztály utolsó paramétere az alábbi konstansok összegéből állhat elő:
Const_JOIN_DOMAIN 1
Const_ACCT_CREATE 2
Const_ACCT_DELETE 4
Const_WIN9X_UPGRADE 16
Const_DOMAIN_JOIN_IF_JOINED 32
Const_JOIN_UNSECURE 64
Const_MACHINE_PASSWORD_PASSED 128
Const_DEFERRED_SPN_SET 256
Const_INSTALL_INVOCATION 262144