
Cikkünkhöz mellékeltük a szóban forgó szkriptet "DeletePrintJob.vbs" néven. Futtatása nem igényel módosítást a forráskódban.
Az alábbiak csak Windows XP-n és a .NET szerver változatokon hajthatók végre.
Milyen következményekkel járhat a várakozási sor túlterhelése?
A nyomtatók várakozási sora alapértelmezésben a %systemroot%\system32\spool mappában található, ami a rendszerköteten van. Sokan gondolják úgy, hogy az operációs rendszert felrakják egy adott kötetre és az adataikat egy másikra. Értelemszerűen az elsőn csak annyi helyet hagynak, hogy a Windows még kényelmesen elférjen. Csakhogy amennyiben ez a gép nyomtató kiszolgálóként működik (nem kell szervernek lennie ehhez, jó a munkaállomás is) a nyomtatásra küldött adatok a rendszerkötetre kerülnek átmeneti tárolásra és ezzel a kötet könnyen betelhet, ami az operációs rendszer működésképtelenségéhez vezethet.
Mit lehet tenni ez ellen? Egyrészt áthelyezhető a várakozási sor egy másik kötetre (lásd a kapcsolódó cikkeket), másrészt tüneti kezelésként írhatunk egy szkriptet, amely törli a nagyobb feladatokat, ezzel helyet szabadítva fel és újra működőképessé téve az operációs rendszert.
Nyomtatási feladatok törlése
Határozzuk meg, hogy melyik gép nyomtatási sorában kívánunk adatokat törölni. Ha pontot (.) adunk meg gépnév vagy IP cím helyett, a helyi gépen hajtjuk végre a műveletet.
Csatlakozzunk a megadott gép WMI (Windows Management Instrumentation) szolgáltatásához a "winmgmts" interfészen keresztül.
Set objWMIService = GetObject("winmgmts:" _
A csatlakozás az aktuálisan bejelentkezett felhasználó nevében történik (impersonationLevel=impersonate), ezért fontos, hogy elégséges jogokkal rendelkezzük, mind a helyi, mind a távoli gépen. A WMI alapértelmezett \root\cimv2 névterében található a később elérni kívánt osztály.
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Futtatunk egy WQL (WMI Query Language) lekérdezést.
Set colPrintJobs = objWMIService.ExecQuery _
Lekérjük a "Win32_PrintJob" osztály összes olyan elemét (nyomtatási feladatát), melyek mérete meghaladja az 1 MB-ot (Size > 1000000).
("Select * from Win32_PrintJob Where Size > 1000000")
A kapott eredményt egy FOR ciklussal feldolgozzuk.
For Each objPrintJob in colPrintJobs
És futtatjuk a visszakapott objektumokon a "Delete_" metódust, törölve ezzel őket.
Zárjuk a ciklust.
Végül megjelenítünk a képernyőn egy feliratot, hogy tudjuk mikor futott le a szkript.