HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Process indítása, leállítása WMI segítségével


Példaprogram letöltése

4128 bájt

A WMI (Windows Management Instrumentation) segítségével programból vezérelhetjük rendszerünket, információkat kérdezhetünk le a számítógépről, valamint be is avatkozhatunk a működésébe. A megfelelő objektumok elérésével lehetőségünk nyílik egy új process-t indítani, vagy leállítani. Cikkünkben megvizsgáljuk, milyen objektum milyen metódusát kell meghívnunk a cél elérése érdekében.

A mellékelt példa megnyitása előtt válasszuk a Project - Import type library menüpontot, majd keressük elő a Microsoft WMI Scripting tételt. Importálás után létrejön egy WbemScripting_TLB unit, mely komponenseket is tartalmaz, amelyeket célszerű rögtön telepítenünk.
A WMI leírhatatlanul sok dologra használható. Megvalósítható vele a Windows konfigurációs feladatainak elvégzése, felhasználói fiókok kezelése, jogosultságok beállítása, az objektumok biztonsági mentése. Meghajtók kezelése a helyi és a hálózat távoli gépén egyaránt: lekérdezhetők és módosíthatók az eszközök tulajdonságai, beállításai.
Olyan rendszerszintű műveletek elvégzésére is alkalmas, mint a naplózó fájl méretének megváltoztatása, vagy a helyi vagy távoli gépek leállítása, újraindítása.
Alkalmazás indítása
Cikkünkben is a WMI egy objektumának felhasználásával végezzük el a Notepad.exe alkalmazás indítását, majd leállítását. A legelső lépés, hogy egy TSWbemLocator komponenst teszünk a Form-ra.
A WMI rendszer eléréséhez meg kell hívnunk a komponens ConnectServer metódusát, majd be kell állítani a szükséges jogosultságokat.
service := SWbemLocator1.ConnectServer('.','root\cimv2','', '', '','', 0, nil); service.Security_.Set_ImpersonationLevel(wbemImpersonationLevelImpersonate);
Annak érdekében, hogy egy adott process-t létrehozzunk, vagy leállítsunk, el kell érnünk a Win32_Process osztályt, mely a CÍM_Process osztályból származik. Az osztály több metódussal és még több property-vel rendelkezik, mely közül a CREATE meghívása eredményezi a Notepad.exe alkalmazás elindítását, vagyis egy új process létrehozását. A metódus eredeti deklarációja a következő:
Create
Osztály: Win32_Process
uint32 Create(
string CommandLine, string CurrentDirectory, Win32_ProcessStartup ProcessStartupInformation, uint32* ProcessId
);
Létrehoz egy process-t a rendszerben, és hozzárendel egy azonosítót. Megjegyzendő, hogy interaktív process-ek nem indíthatók ezzel a módszerrel.
Paraméterek
string CommandLine
A process indításához szükséges adatokat tartalmazza (program parancssor, argumentumok). Az itt megadott információ a CommandLine paraméter értéke is lesz.
string CurrentDirectory
Az indítandó programot tartalmazó mappa elérési útvonala. NULL esetén a hívó alkalmazás mappája.
Win32_ProcessStartup ProcessStartupInformation
A process tulajdonságainak listáját tartalmazó objektum megadása. Ablakkal rendelkező alkalmazás esetén megadható ennek mérete, pozíciója és egyéb tulajdonságok.
uint32* ProcessId
A művelet végén visszaadja a process azonosítóját.
Visszatérési érték
Sikeres művelet-végrehajtás esetén nulla.
A Win32_Proces osztályt tehát a következőképpen érhetjük el.
process := service.Get('Win32_Process', 0, nil);
Ekkor kapunk egy szervizobjektumot, melynek segítségével meghívhatjuk a Win32_Process osztály Create metódusát megfelelően paraméterezve, valamint megadhatjuk a CommandLine property értékét.
A metódus nevét elhelyezzük a Methods_ nevű kollekcióban, melynek eredményeképpen megkapjuk a metódust reprezentáló objektumot.
method := Process.Methods_.Item('Create', 0);
Ennek tulajdonságait kell feltöltenünk ahhoz, hogy a metódus paraméterei adottak legyenek.
inParam := method.InParameters.SpawnInstance_(0);
p1 := inParam.Properties_.Add('CommandLine', wbemCimtypeString, False, 0);
value:= 'Notepad.exe';
p1.Set_Value(value);
A szervizobjektum ExecMethod metódusával pedig le is futtathatjuk a Win32_Process osztály Create metódusát.
outParam:= process.ExecMethod_('Create', InParam, 0, nil);
Amennyiben a műveletvégzés sikeres volt, akkor a visszatérési érték nulla.
rv:= outParam.Properties_.Item('ReturnValue', 0);
...
Ekkor lekérdezhetjük a process azonosítót is.
p2:= outParam.Properties_.Item('ProcessID', 0);
Erre az azonosítóra – a Create metódus kimenő paramétere – szükségünk lesz a leállítási műveletben, a cikk következő szakaszában.
Alkalmazás leállítása
A leállításkor már azzal a process objektummal lépünk kapcsolatba, melynek azonosítója a kapott ProcessID.
SObject := service.Get('Win32_Process.Handle="' + WideString(p2.Get_Value) + '"', 0, nil);
Ekkor a Terminate metódusát hívjuk meg a Win32_Process osztálynak. A metódus deklarációja a következő:
Terminate
Osztály: Win32_Process
uint32 Terminate(
uint Reason
);
A process és szálainak leállítását végzi el.
Paraméterek
uint Reason
Egy kilépési kód.
Visszatérési érték
Amennyiben a folyamat terminált, akkor a visszatérési érték nulla.
A metódus számára létrehozzuk az objektumot.
method := SOBject.Methods_.Item('Terminate', 0);
Majd megadjuk a paraméter értékét, mely most nulla.
inParam := Method.InParameters.SpawnInstance_(0);
p1 := inParam.Properties_.Add('Reason', wbemCimtypeUint32, False, 0);
value := 0;
p1.Set_Value(value);
A hívás az Execmethod függvénnyel történik itt is.
outParam := SObject.ExecMethod_('Terminate', inParam, 0, nil);
rv := outParam.Properties_.Item('ReturnValue', 0);
A Notepad.exe alkalmazás leáll a művelet eredményeképpen.

Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2003 évkönyv 710. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |