Windows - IP címek módosítása távolról

forráskód letöltése
Ha módosítani kell egy hálózati számítógép statikus IP címét és alapértelmezett átjáróját, nem feltétlenül kell leülni a gép elé, megtehetjük távolról egy ügyes szkript segítségével. Azokban a hálózatokban, ahol nem DHCP-n keresztüli IP cím kiosztás van, gyakorlatilag az összes Windows 2000/XP/.NET gép címe távolról, egy központi gépről konfigurálható, ezzel mintegy "kézi DHCP" szervert hozva létre.
Mellékeltük az alábbi szkriptet "SetIP.vbs" névvel. Felhasználása előtt a "NewIPAddress", "NewSubnetMask", "NewGateway" változókba valós IP címeket kell megadni. A "Computer" változóba pedig annak a gépnek a nevét, amelyiken végre akarjuk hajtani a módosítást.
Felvetül azonban egy-két probléma az ötlettel kapcsolatban:
Először is ahhoz, hogy távolról be lehessen állítani egy gép IP címét, valamilyen módon hálózati kapcsolatba kell kerülni vele, ami annyit jelent, hogy a jelenlegi címének ugyanazon az alhálózatba kell esni, mint annak a gépnek, amelyikről a módosítást végre akarjuk hajtani. Tegyük fel, hogy ismeretlen a célgép címe. Hogy lehet akkor rátalálni? Egyszerűen hivatkozzunk rá a nevével, a NetBIOS protokoll üzenetszórásos keresése gondoskodik a gép megtalálásáról.
Másik probléma, hogy a módosítást végző felhasználónak a távoli gépen is érvényes névvel és jelszóval kell rendelkezni, méghozzá rendszergazdai jogosultsággal. A nevet és jelszót nem kell külön beírni, mert automatikusan átadódik. Lényeg, hogy ugyanaz legyen mindkét gépen.
Lássunk neki a megvalósítást végző szkript elkészítésének.
Helyezzük el rögtön az elején néhány változóba a szükséges paramétereket. Írjuk be a "Computer"-be a gép NetBIOS nevét (=gépnév, pl.: "Kentaur"). Ha pontot (.) adunk meg, a módosítás a helyi gépen zajlik. Adjuk meg a "NewIPAddress", "NewSubnetMask", "NewGateway" változókba az új IP címet, alhálózatot illetve átjáró címet.
Computer = "."
NewIPAddress = Array("192.168.0.6")
NewSubnetMask = Array("255.255.255.0")
NewGateway = Array("192.168.0.1")
Ezután létesítsünk kapcsolatot az adott géppel a WMI (Windows Management Intrumentation) szolgáltatás "winmgmts" interfészén keresztül. Az IP cím változtatás a "Win32_NetworkAdapterConfiguration" osztály feladata, ami a \root\cimv2 névtérben található.
Set objWMIService = GetObject("winmgmts:\\" & Computer & "\root\cimv2")
Kérjük le az osztály összes tulajdonságát, ahol az adott példány "IPEnabled" értéke igaz (true).
Set colNetAdapters = objWMIService.ExecQuery ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
Az alapértelmezett átjáró metrikáját is be kell majd állítani. Maradjunk az alapértelmezett 1-es értéknél. Természetesen, ha bonyolultabb a hálózat és több metrikát különböztetünk meg, több átjárón, akkor írjuk be a szükséges értéket.
NewGatewayMetric = Array(1)
Dolgozzuk fel a fenti lekérdezés eredményét egy ciklussal.
For Each objNetAdapter in colNetAdapters
Az IP cím beállítása az "EnableStatic" metódussal történik. Paraméterként át kell adni az új címet és az alhálózati maszkot. Tároljuk el a metódus visszatérési értékét egy változóba ("Error").
 Error = objNetAdapter.EnableStatic(NewIPAddress, NewSubnetMask)
Az alapértelmezett átjáró címének megváltoztatása a "SetGateways" metódussal történik. Itt paraméterként az új átjáró címet és metrikát kell megadni.
 ErrorGateways = objNetAdapter.SetGateways(NewGateway, NewGatewaymetric)
Ellenőrizzük le az IP cím beállítás visszatérési értékét, ha nullától eltérő számot kapunk, nem sikerült a módosítás.
 If Error = 0 Then
  WScript.Echo "Az IP cím megváltozott."
 Else
  WScript.Echo "Hiba az IP cím megváltoztatásakor."
 End If
Next
Nem ellenőriztük az alapértelmezett átjáró állításánál keletkező visszatérési értéket. Ennek oka, hogy ha az IP cím módosítás sikertelen, akkor az átjáróé is. Illetve, ha az IP sikeres, akkor az átjáró is.
Nézve a forráskódot felmerülhet egy kérdés: mi van, ha több hálózati kártya található a gépben? Mivel ciklust használtunk, ezért az összes kártyán megkísérli a szkript a módosítást. Ami természetesen nem működhet, mert nem lehet egy hálózatban két kártyának ugyanaz a címe. Ekkor az elsőé megváltozik és a második változtatásakor hibaüzenetet kapunk. Ez a probléma a gyakorlatban nem probléma, mert munkaállomásokban csak a legritkább esetben található több hálózati kártya. Szerverekben inkább előfordulhat, de ott meg nem jellemző, hogy gyakran változnának a címek. Így mégiscsak használható szkriptet írtunk.