Windows - Folyamatvezérlés szkriptekből

forráskód letöltése
A Windows Management Instrumentation (WMI) szolgáltatáson és a hozzá kapcsolódó adatbázison keresztül számos Windows funkció érhető el, kérdezhető le és befolyásolható. Cikkünkben a rendszerben futó folyamatok (process) kezelését mutatjuk be WMI szkripteken keresztül. Cikkünkhöz mellékelve megtalálhatók a példákban szereplő szkriptek:

"ProcessList.vbs" - Parancssorban a "cscript ProcessList.vbs" utasítással futtatva előállít egy listát a rendszerben pillanatnyilag futó folyamatokról és néhány tulajdonságukról.
"ProcessTerminate.vbs" - Feltétel nélkül bezárja az összes futó "notepad.exe" alkalmazást.
"ProcessCreate.vbs" - Egy új folyamat létrehozásaként elindítja a Számológép (calc.exe) programot.

Az első megvalósítandó feladat a futó folyamatok listájának lekérdezése. Ez a "Win32_process" osztállyal lehetséges. A rendszer grafikus felületen ezt a feladatkezelőben mutatja meg: CTRL+ALT+DEL > Feladatkezelő > Folyamatok (CTRL+ALT+DEL > Task Manager > Processes) . Minden folyamathoz tartozik egy azonosító (PID), amely az indulásakor generálódik és jó eséllyel egy leállítás és ismételt elindítás után megváltozik. Azonban legegyszerűbben ezzel lehet hivatkozni a folyamatra, mert ez egyértelműen beazonosítja. A másik hivatkozási alap az elinduló EXE fájl neve, de ezzel az a probléma, hogy több példányban való futtatásnál nem lehet tudni, hogy melyik példányhoz melyik folyamat tartozik.
A "Win32_process" osztály eléréséhez nincs szükség különleges jogokra ("impersonationLevel=impersonate").
A WMI "tárház" eléréséhez a "winmgmts" objektumot kell használni. Ennek megfelelően egy FOR ciklusban lekérdezzük az összes folyamatot és kiíratjuk a főbb jellemzőiket.
for each Process in GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf
   ("Win32_process")
Következik a tulajdonságok kiíratása. A folyamatok neve a "Name" tulajdonságban tárolódik:
   WScript.Echo Process.Name
A már említett azonosító (PID) a ProcessID-ben:
   WScript.Echo Process.ProcessID
Mindegyikhez tartozik egy futási prioritás. Minél nagyobb annál többször "áll szóba" vele a processzor és annál gyorsabban képes elvégezni a feladatát:
   WScript.Echo Process.Priority
Megjeleníthetünk a WMI segítségével olyan tulajdonságokat is, amelyek a grafikus felületről nem érhetőek el. Ilyen a legmagasabb memória használati érték. Egy kiszolgáló hardver és szoftver igényeinek felmérésénél nagyon hasznos információval szolgálhat, ha tudjuk, hogy a futtatandó alkalmazásnak időnként (főleg nagyobb terhelésnél) mekkora az "étvágya":
   WScript.Echo Process.PeakVirtualSize
A rendszerben a futás óta végzett olvasási műveletek száma:
   WScript.Echo Process.ReadOperationCount
A futási ideje nanoszekundumban kiírva:
   WScript.Echo Process.UserModeTime
Végül ismét egy rendszertervezésnél hasznos információ: A hatásos működéshez szükséges memória mennyisége, ez egy átlagérték a minimális és a maximális felhasználás között.
   WScript.Echo Process.WorkingSetSize
Next
Az elkészült szkriptet parancssorból a CSCRIPT.EXE programon keresztül célszerű futtatni, mert listaszerűen jeleníti meg a kimenetét és grafikus felületen ez egymást követő ablakok sokasága lenne. Ha "ProcessList.vbs" néven mentettük az állományt a következő utasítást kell kiadni a saját könyvtárában:
cscript ProcessList.vbs

A folyamat kezelés egyik fontos lépése a folyamatok futásának megszüntetése. Fent említettük, hogy hivatkozási pont lehet a PID szám vagy az EXE fájl neve. Írjunk egy szkriptet, keresse meg az összes futó Jegyzettömb (Notepad) folyamatot és küldjön nekik egy feltétel nélküli bezárásra vonatkozó utasítást. Ha voltak nem mentett dokumentumok, azok elvesznek. Ebben az esetben az EXE névvel lehet hivatkozni a folyamatokra:
for each Process in GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery ("select * from
    Win32_Process where Name='notepad.exe'")
A "Terminate" metódussal lehet elvégezni a bezárást:
Process.Terminate
Next

Végül nézzük meg, hogy lehet egy új folyamatot létrehozni és ezzel egy programot elindítani. A WMI gyökér alatti "cimv2"névterében található erre alkalmas metódus:
set services = GetObject("winmgmts:root\cimv2")
Neve a már az előbb is használt "Win32_Process" osztály:
Set Obj = Services.Get("Win32_Process")
Indítsuk el a számológép segédprogramot (calc.exe):
ReturnValue = Obj.Create("calc.exe",,,ProcessID)
Végül jelenítsük meg a képernyőn a elindult folyamat PID számát:
MsgBox "Process ID = " & ProcessID
Ellenőrzésképpen tallózzunk el a CTRL+ALT+DEL > Feladatkezelő > Alkalmazások (CTRL+ALT+DEL > Task Manager > Applications) oldalra, keressük ki a listából a Számológép (Calculator) nevű feladatot, kattintsunk rá a jobb oldali egérgombbal és válasszuk az "Ugrás folyamatra" ("Go To Process") menüsort. Ekkor átkerülünk a másik listába és nézzük meg, hogy a PID számnál az van-e írva, mint amit a szkriptünk adott vissza.