
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.
Néhány alkalmazási terület
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 lapozófájl méretének megváltoztatása vagy a helyi vagy távoli gépek leállítása, újraindítása.
Windows 2000-ben a felügyeleti eszközök Kezelés (Manage) konzolja a benne lévő segédprogramokkal és a Rendszertulajdonságok (System Properties) szolgáltatás aktívan használja.
A CIM modell
A WMI integrált támogatást biztosít a CIM modellhez (Common Information Model = Általános információs modell). A CIM írja le egy vállalati környezetben található objektumokat, tulajdonképpen egy hatalmas adatbázis. Ha pontosabban akarunk fogalmazni, akkor inkább a különböző vállalati részekről információt tároló, programozási nyelv független, kiterjeszthető, objektum orientált adatmodell megnevezést kell használnunk. A fejlesztő a WMI szolgáltatáson keresztül elérve a CIM-t kezelheti a merevlemez meghajtókat, alkalmazásokat, hálózati elemeket (pl. router) vagy hálózatba kapcsolt egyedi, programozható eszközöket (akár a légkondicionálót is).
A WMI osztályok (WMI Classes)
- System Classes: A CIM előre definiált osztályainak egy gyűjteménye. Olyan elemeket tartalmaz, mint események regisztrálása, rendszer biztonsági beállítások, figyelmeztető üzenetek generálása. Az osztályok egyedi elnevezési rendszerrel rendelkeznek két aláhúzott vonalat követ az osztály neve (pl: __NotifyStatus, __Parameters, __SystemSecurity).
- Win32 Classes: A számítógép hardver elemeinek elérését biztosítja, még a processzor hűtőventillátor kezeléséhez (fordulatszám lekérdezés, szabályozás) is tartalmaz osztályokat. A teljes Windows operációs rendszert alkotó objektumok elérhetők (pl.: szolgáltatások, hálózati megosztások, felhasználói fiókok, ütemezett feladatok, Registry, termék aktiválás, COM, telepített alkalmazások, teljesítmény számlálók, stb.).
- Standard Consumer Classes: Az egyéb kategóriába sorolható, bár cseppet sem mellékes: szkriptek által generált események kezelése, regisztrálása, naplózása, SMTP szolgáltatás és a parancssor által generált események kezelése. Ezek csak a főbb osztályok, de a programozási nyelvek támogatásához, csoportházirendek kezeléséhez és esemény összefüggések vizsgálatához is találunk több száz függvényt, metódust és tulajdonságot. Ezenkívül, úgynevezett Provider-eken keresztül hozzáférhető az Active Directory, DFS, lemezkvóta, energiaellátás, SNMP és sok más része is a számítógépnek hardveres és szoftveres szemszögből egyaránt.
Hogy lehet ezt a rengeteg adatot elérni?
Mint említettük a WMI rendelkezik programozási interfészekkel, így gyakorlatilag bármilyen alkalmazás fejlesztői környezetből használható. A motort egy WQL (WMI Query Language) elnevezésű lekérdezőnyelv adja, ahol szabályos SQL parancsokkal dolgozhatunk.
Névterek (Namespaces)
Az osztályok logikailag csoportokba vannak rendezve a könnyebb kezelhetőség kedvéért, ezeket a csoportokat névtereknek nevezzük. Ábrázolását egy faszerkezetben kell elképzelni, ahol a gyökérből (root) indulunk ki és az ágak különböző mélységig egymásba ágyazódnak (pl.: root\cimv2 vagy root\directory\LDAP).
Biztonság
A WMI hitelesítési eljárások használatával fér hozzá az objektumokhoz, ezért a futtatáshoz megfelelő jogokkal kell rendelkezni. Képes a felhasználó nevét és jelszavát használni. Ha az adott személy jogosult az erőforrás elérésére sikeres lesz a hozzáférés.
Nézzünk egy egyszerű WMI-t használó VBScript-et, amellyel kiléphetünk az operációs rendszerből és újraindíthatjuk a számítógépet:
Set OpSysSet = GetObject("winmgmts:{(Shutdown)}//./root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")
for each OpSys in OpSysSet
OpSys.Reboot()
next
A "winmgmts" szolgáltatás "Win32_OperatingSystem" osztály elérésével meghívtuk a gép újraindításáért felelős metódusát (Reboot). Jól látszik a WQL lekérdezés használata is. A Windows 9x rendszerekben a Windows Management szolgáltatás egy WINMGMTS.EXE programon keresztül futott. Windows NT/2000/XP-ben ez bekerült az SVCHOST szolgáltatásba.
WMI elérése Delphi-ből
Térjünk most át arra, hogy miként használhatjuk mindezt egy Delphi alkalmazásból.
Először is szükségünk lesz egy Type Library-ra. Válasszuk tehát 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ű telepítenünk.
Ezek után tegyünk fel egy TSWbemLocator komponenst a Form-ra. A ConnectServer függvényt meghívva létrehozhatjuk a WMI eléréséhez szükséges kapcsolatot.
ws:=SWbemLocator1.ConnectServer('', 'root\cimv2', '', '', '', '', 0, nil);
ws.Security_.Set_ImpersonationLevel(wbemImpersonationLevelImpersonate);
Példaként listázzuk ki a C: meghajtó tulajdonságait. Ehhez a Win32_LogicalDisk előre összeállított lekérdezést kell futtatnunk, paraméterként megadva a C: meghajtót.
wo:=ws.Get('Win32_LogicalDisk="C:"', 0, nil);
for i:=0 to 21 do begin
try
A kapott eredmény tulajdonságait a Properites_ property-n keresztül érhetjük el, annak Item függvényét meghívva. Ebben az első paraméter egy sztring lesz. Ez a sztring a lekérdezendő tulajdonság neve. Ezt a lekérdezést célszerű try-except blokkba tenni, mivel nem minden tulajdonságnak lesz értéke, de ha megpróbáljuk azt is kiolvasni, akkor hibaüzenettel leállna programunk.
wp:=wo.Properties_.Item(names[i], 0);
ListBox1.Items.Add(wp.Name+': '+wp.Get_Value);
except
end;
end;