HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Számítógép leállítása WMI segítségével


Példaprogram letöltése

8835 bájt

Az NT alapú rendszerek esetén képesek vagyunk programjainkból elvégezni a számítógép leállítását, újraindítását vagy akár a kijelentkezés műveletét. Ez többféleképpen elérhető, cikkünkben annak járunk utána, hogyan lehetséges ez a Windows Management Instrumentation (WMI) segítségével. Az olyan szigorúan privilegizált rendszerekben, mint az NT alapú operációs rendszerek, szükség van arra, hogy a megfelelő joggal rendelkezzünk a művelet elvégzéséhez. A cikkből kiderül az is, hogyan szerezhető meg ez.

A mellékelt példában ki kell választanunk egy műveletet, majd a VÉGREHAJTÁS gombbal elvégezni azt. A művelet a szükséges jog megszerzéséből, és a tényleges műveletvégzésből áll.
Szükséges privilégium megszerzése
Ahhoz, hogy jogunk legyen újraindítani, leállítani egy gépet NT/2000/XP alatt, ahhoz szükséges a SE_SHUTDOWN_NAME privilégium megszerzése az alkalmazásunk számára. Ezt az AdjustTokenPrivileges függvény hívásával megtehetjük, viszont a függvény paramétereihez szükségünk van néhány értékre, melyek megszerzéséhez ismét további függvényeket kell meghívnunk ennek használata előtt.
A függvények deklarációit a Win32 osztályban helyeztük el. Az osztály AddRights nevű statikus metódusában hívjuk meg a függvényeket a fent említett privilégium megszerzéséhez. Első lépésben megszerezzük az alkalmazásunk process-éhez kapcsolódó ACCESS TOKEN-t az OpenProcessToken metódussal.
LuidAttr tp;
IntPtr h = IntPtr.Zero;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref h);
Ezt követően egy egyedi azonosítót kell megszereznünk. Erre szolgál a LookupPrivilegeValue metódus.
LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
Majd az AdjustTokenPrivileges metódussal kaphatjuk meg a privilégiumot.
AdjustTokenPrivileges(h, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
Most már minden adott ahhoz, hogy a WMI megfelelő metódusával elvégezzük a műveletet.
WMI művelet
A ManagementScope osztály segítségével kapcsolódhatunk a műveletvégző névtérhez.
ManagementScope ms = new ManagementScope("\\\\localhost\\root\\cimv2");
ms.Options.EnablePrivileges = true;
Megvalósítjuk a lekérdezést, mely az operációs rendszer információira irányul.
ObjectQuery oq = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
Ezt követően létrehozunk egy ManagementObjectSearcher osztályt, mely abban segít bennünket, hogy az összes környezeti változón, mint egy tömbön, végig tudjunk menni.
ManagementObjectSearcher s = new  ManagementObjectSearcher(ms,oq);
ManagementObjectCollection mocollection = s.Get();
Ezt a tömböt szolgáltatja az osztály Get függvénye.
A tömb meghatározott elemének meg kell hívnunk a Win32Shutdown metódusát, mely szolgáltatja az összes leállítási művelettípus képességét. Csupán megfelelően paramétereznünk kell a metódust.
foreach(ManagementObject mo in mocollection)
{
  string[] ss = {comboBox1.SelectedIndex.ToString(),"0"};
  mo.InvokeMethod("Win32Shutdown",ss);        
}
A paraméter egy tömb lesz, melynek első eleme a művelet típusát megadó konstans. Ennek értékei a következők lehetnek:
  • 0: kijelentkezés
  • 1: leállítás
  • 2: újraindítás
A második paraméter nulla.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 754. 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 |