A Windows Management Instrumentation (WMI) szolgáltatás segítségével a Windows operációs rendszer gyakorlatilag minden része elérhető. Információkat kérdezhetünk le és bizonyos összetevőket be is állíthatunk. Figyelembe véve, hogy a Windows 2000 szigorú biztonsági előírásokkal rendelkezik, a fejlesztőknek programjaik és szkriptjeik megírása során figyelembe kell venni ezeket. Cikkünkben arról esik szó, hogy a WMI a gyakorlatban milyen megoldásokat kínál a biztonsági szintek beállítására az objektum hozzáférések során. Egy egyszerű példa: az Eseménynapló (Event Viewer) szolgáltatás Biztonsági naplóját (Security Log) nem érhetik el a felhasználók. Ha írunk egy szkriptet, amely kiolvassa a naplóbejegyzéseket és ezt egy rendszergazdai jogosultságokkal rendelkező egyén futtatja, akkor a szkript lefut. Ha viszont ugyanezt a szkriptet egy felhasználó futtatja - hibajelzést fog kapni és nem jut hozzá a naplóadatokhoz. Mindezt a WMI megoldja, de nekünk is van némi tennivalónk programozás közben...

Cikkünkhöz mellékeltünk egy Registry exportállományt, amelyet futtatva visszaállítja a WMI objektumelérések alapértelmezett szintjét.
Az elso alkalommal, amikor egy adott szkripttel végrehajtunk egy objektum hozzáférést, be kell állítanunk a jogosultsági szintet. Figyelembe kell venni, hogy a Windows 2000 kiszolgáló verziók sokkal szigorúbb eloírásokkal rendelkeznek, mint a Professional változat és a Windows XP Professional is szigorúbb Windows 2000-beli névrokonánál. Elofordulhat, hogy ugyanaz a program egyik rendszer alatt muködik, másik alatt nem.
A biztonsági szint beállításának VB szkriptek esetében két módja van. Az egyik a "SWbemSecurity" objektumon keresztüli megvalósítás. Például a következo objektumok végrehajtása során - SWbemLocator, SWbemServices, SWbemObject, SWbemObjectSet, SWbemObjectPath, SWbemLastError, SWbemEventSource - a "Security__" tulajdonság írásával lehet a szintet beállítani és ugyanitt kiolvasni.
Például VB szkriptekben a következo minta sor alkalmazható:
services.Security_.ImpersonationLevel = wbemImpersonationLevelImpersonate
Másik megoldás cikksorozatunk elozo részéhez kötodik. Ott mutattuk be a "Winmgmts" szolgáltatást, amelynek feladata, hogy összekösse a felhasználói alkalmazásokat a WMI objektumokkal. Lehetoséget biztosít továbbá a biztonsági szintek beállítására is a "Getobject" metódusa segítségével. Például:
Set Service = GetObject ( "winmgmts:{impersonationLevel = impersonate,authenticationLevel = pktPrivacy }!root/cimv2" )
VB szkriptbol az alábbi hitelesítési eljárásokat használhatjuk:
Név |
Értéke |
Beállítható szint |
Leírás |
wbemAuthenticationLevelDefault |
0 |
Default |
WMI az alapértelmezett Windows hitelesítési beállításokat alkalmazza. |
wbemAuthenticationLevelNone |
1 |
None |
Nincs hitelesítési eljárás. |
WbemAuthenticationLevelConnect |
2 |
Connect |
Kliens szerver kapcsolat kialakítása során csak a kliens azonosítja magát. |
WbemAuthenticationLevelCall |
3 |
Call |
Kliens szerver kapcsolat kialakítása során a kliens minden egyes kérésénél azonosítania kell magát. |
WbemAuthenticationLevelPkt |
4 |
Pkt |
Minden egyes adatküldésnél a kiszolgáló is azonosítja magát. |
WbemAuthenticationLevelPktIntegrity |
5 |
PktIntegrity |
Hitelesíti és folyamatosan ellenorzi a kiszolgáló és az ügyfél közötti adatforgalmat. |
WbemAuthenticationLevelPktPrivacy |
6 |
PktPrivacy |
Az összes elozo szintet véghezviszi és minden távoli eljárás hívást titkosít. |
Íme egy gyakorlati példa a használatára:
Set objservices = GetObject _ ( "WinMgmts:{impersonationLevel = impersonate}!/root/cimv2" )
objservices.Security_.AuthenticationLevel = wbemAuthenticationLevelPktIntegrity
A bevezetoben írtunk arról, hogy adott szkriptet nem mindegy, hogy egy felhasználó vagy egy rendszergazda futtat, ugyanis a futtató személy adataival próbál a szkript a rendszerobjektumokhoz hozzáférni. Ha valaki rendszergazdaként indítja még nem jelenti automatikusan azt, hogy mindenhez hozzá is férhet. Vannak olyan objektumok, amelyeket csak a tulajdonosa vagy a SYSTEM fiók jogosult elérni. Nagyon egyszeru példa az Exchange 2000 Server által kezelt E-mail üzenetek elérése. Alapértelmezésben a legmagasabb szintu rendszergazda (vállalati rendszergazda) is csak korlátozott hozzáférésben részesül.
A hitelesítésen kívül elég gyakran szükséges az Azonosítási szint (Impersonation Level) beállítása is. Foleg COM objektumok WMI-on keresztüli elérésénél. A következo lehetoségeink vannak:
Megnevezés |
Azonosítási szint |
Alkalmazási név |
Leírás |
wbemImpersonationLevelAnonymous |
1 |
Anonymous |
Névtelen azonosítási szint. A futtató adatai rejtve maradnak. |
wbemImpersonationLevelIdentify |
2 |
Identify |
Engedélyezi az elérendo objektumok számára, hogy lekérdezzék a hívó adatait. Ha az objektum nincs erre felkészítve, akkor sikertelen lesz az azonosítás. |
wbemImpersonationLevelImpersonate |
3 |
Impersonate |
Ez az alapértelmezett beállítási szint és erre lesz a leggyakrabban szükség. Muködése során az alkalmazást futtató adatai átadódnak a hívott objektum számára. Ha engedélyezett az egyén hozzáférése sikeres lesz a futtatás, ha nem, akkor hibaüzenet generálódik. |
wbemImpersonationLevelDelegate |
4 |
Delegate |
Csak Windows 2000-ben és az azt követo verziókban áll rendelkezésre. Lényege, hogy bizonyos személyek meghatalmazhatók, bizonyos feladatok elvégzésére. Ehhez és csak ehhez az alapértelmezett jogosultsági szintjüknél magasabb jogokat is kaphatnak. |
Alkalmazási példa:
set object = GetObject ( "winmgmts:{impersonationLevel = impersonate} !root\cimv2:Win32_Process.Handle = '0' " )
Az alapértelmezett szint a regisztrációs adatbázisban tárolódik. Innen kiolvashatjuk és meg is változtathatjuk. A
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\Scripting
kulcs alatt található egy "Default Impersonation Level" nevu duplaszó típusú bejegyzés. Értéke alapesetben "3". A fenti táblázatban látható, hogy ez az "Impersonate" szint, tehát az alkalmazás futtatójának a felhasználói neve és jelszava adódik át egy objektumelérés alkalmával.
WMI cikksorozat