Delphi - Alkalmazás leállítása, újraindítása WMI-al

forráskód letöltése
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 működésébe. A rendszer egy újabb lehetőségével ismerkedhetünk meg cikkünkben. Bemutatjuk, hogy milyen WMI objektumot kell elérnünk ahhoz, hogy a rendszerünket újraindítsuk, vagy éppen leállítsuk.
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 mellékelt alkalmazás ComboBox komponensében ki kell választanunk az elvégzendő feladatot. A kiválasztott művelettől függően hívjuk meg a WMI objektum adott metódusát. A legelső lépés, hogy egy TSWbemLocator komponenst teszünk a Form-ra.
A művelet elvégzése előtt rákérdezünk a végrehajtásra.
if MessageBox(0, PChar('Biztos abban, hogy leállítható/újraindítható a rendszer?'), PChar(Form1.Caption), MB_YESNO or MB_ICONEXCLAMATION or MB_DEFBUTTON2)= mrYes
...
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. Itt egy „.” karakterrel jelöljük, hogy a helyi rendszerrel kapcsolatos műveletről lesz szó.
service := SWbemLocator1.ConnectServer('.','root\cimv2','', '', '','', 0, nil); Service.Security_.Privileges.Add(wbemPrivilegeShutdown, True);
A művelethez szükséges jogot a wbemPrivilegeShutdown konstans tartalmazza.
Annak érdekében, hogy a rendszert leállítsukc vagy újraindítsuk, el kell érnünk a Win32_OperatingSystem osztály egy példányát, és meghívnunk az objektum ShutDown, vagy Reboot metódusát. Az objektumot a következőképpen értük el:
ObjectSet:= Service.ExecQuery('SELECT * FROM Win32_OperatingSystem WHERE Primary=True', 'WQL', wbemFlagReturnImmediately, nil);
Tulajdonképpen egy lekérdezést hajtottunk végre, mely az operációs rendszer beállításait adja eredményül, köztük a szükséges objektumokkal.
Enum:= (ObjectSet._NewEnum) as IEnumVariant;
Most kaptunk egy objektum-kollekciót, melynek elemei rendelkeznek a metódusok meghívásának lehetőségével.
while (Enum.Next(1, TempObj, Value) = S_OK) do begin
  SObject:= IUnknown(tempObj) as SWBemObject;
  if comboBox1.ItemIndex = 0 then
    SObject.ExecMethod_('Shutdown', nil, 0, nil)
  else
    SObject.ExecMethod_('Reboot', nil, 0, nil)
end;
Az egyes objektumok ExecMethod_ metódusa segítségével hívható meg a megfelelő függvény, mely a leállítást vagy az újraindítást végzi el. A metódushíváskor az első paraméterben találjuk meg a meghívandó függvénynevet, a másodikban pedig a paraméterek tömbjét, amennyiben vannak a meghívandó metódusnak paraméterei.
A műveletek elvégzése előtt természetesen gondoskodnunk kell arról, hogy a munkánk mentése megtörténjen.