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.