Windows - DNS-ügyfél szolgáltatás elindítása és leállítása szkriptekből

forráskód letöltése
Windows 2000 alatt előfordulhat, hogy nem működik a DNS névfeloldó szolgáltatás. Ekkor újra kell indítani a számítógépet és ismét helyreáll a rend. Egy kiszolgáló esetében ez nem a legszerencsésebb módja a hibajavításnak és arra sincs mód, hogy mindig a gép mellett üljünk. Cikkünkben készítünk egy szkriptet, amely javítja a hibát újraindítás nélkül is és nem csak a DNS, hanem bármilyen más szolgáltatás leállítására és elindítására alkalmas.
Cikkünkhöz mellékelve megtalálható az alábbiakban szereplő szkript. Futtatva leállítja és elindítja a DNS-ügyfél szolgáltatást.
Az alábbiakban szereplő műveletek elvégzéséhez rendszergazdai jogosultság szükséges.
A hibajelenség abból áll, hogy a gép nem lát "kifelé", tehát nem képes a kéréseket feloldani IP címekké. Ellenkező irányban minden rendben van, a kliensek képesek csatlakozni az adott géphez. A probléma a "DNS-ügyfél" ("DNS-Client") szolgáltatás lefagyása. Amikor újraindítjuk a gépet, akkor ez is újraindul és működik tovább. A gép újraindítása nélkül a következő módon lehet elhárítani a hibát:
Indítsuk el a Felügyeleti eszközök > Szolgáltatások ("Administrative Tools > Services") konzolt és keressük meg a "DNS-ügyfél" ("DNS-Client") szolgáltatást. Kattintsunk rá a jobb oldali egérgombbal és válasszuk az "Újraindítás" ("Restart") menüt. Rövid várakozás után megtörténik a szolgáltatás leállítása és ismételt elindítása.
Ennél a módszernél van egyszerűbb megoldás is: Készítsünk egy szkriptet, amely elvégzi a fenti lépéseket helyettünk. A Windows Management Instrumentation (WMI) "Win32_Service" osztálya kezeli a szolgáltatásokat. Nem csak tulajdonságokat, de metódusokat is elérhetővé téve.
Szolgáltatás leállítása
Első dolog, amit meg kell tennünk, hogy csatlakozunk az osztályhoz és lekérdezzük az összes példányát. Hitelesítési szintnek az "impersonate" értéket adva, egy rendszergazda számára már elérhetővé válnak az objektumok.
Set ServiceSet = GetObject( "winmgmts: {impersonationLevel = impersonate}" ).ExecQuery ("select * from Win32_Service")
Ezután egy ciklussal ellenőrizzük le egyesével a visszakapott gyermekobjektumokat és keressük ki a DNS-ügyfelet. Hogy tudjuk meg, hogy melyik az? Meg kell nézni a "Name" vagy "Description" tulajdonságokat. Hogy melyiket az a legtöbb WMI objektumnál mindegy, mert tartalmuk megegyezik. A szolgáltatás leállítására használjuk a "StopService" metódust és ellenőrizzük le, hogy hiba nélkül lefutott-e. Ha nem, akkor írjunk ki a képernyőre egy hibaüzenetet és a hibakódját.
  for each Service in ServiceSet
    if Service.Description = "DNS-ügyfél" then
     error=Service.StopService
     if error <> 0 then WScript.echo "A szolgáltatás leállítása közben hiba keletkezett. Kódja:" & error
    end If
  next
Ezzel az adott szolgáltatás leállt. Most az elindítást végző kód következik.
Szolgáltatás elindítása
A hitelesítés és a "Win32_Service" objektum elérése most is ugyanúgy zajlik, mint az előbb. Az objektum példányokon is ugyanúgy végre kell hajtani az ellenőrzést, de ezúttal a "StartService" metódus meghívására lesz szükség.
Set ServiceSet = GetObject( "winmgmts: {impersonationLevel = impersonate}").ExecQuery ("select * from Win32_Service")
  for each Service in ServiceSet
    if Service.Description = "DNS-ügyfél" then
     error=Service.StartService
     if error <> 0 then WScript.echo "A szolgáltatás elindítása közben hiba keletkezett. Kódja:" & error
    end If
  next
Más szolgáltatások leállításához, elindításához vagy újraindításához a fenti kódban át kell írni a "DNS-ügyfél" nevet az adott szolgáltatás nevére.