A blogban leírtak a szerzők saját véleménye, és nem a munkáltatójuké.

WMI kapcsolatok megjelenítése

A CIM/WMI témák lezárásaként idén még egy kérdés került elő. Jó-jó, hogy a CIM szabvány dokumentumai között vannak grafikus modellek az egyes osztályok tulajdonságainak és kapcsolatainak ábrázolásáról, de mi a helyzet, ha én a WMI-specifikus osztályokat szeretném megnézni. Az MSDN oldalán (WMI Classes) van egy hierarchikus, szöveges összefoglaló arról, hogy milyen Win32 kezdetű osztályok vannak, de ebben pont az összefüggéseket nem lehet jól látni. Meglepő módon nem találtam erről semmi ábrát, de szerencsére ezt nem olyan nehéz elkészíteni.

A feladat tulajdonképpen a kapcsolóosztályok (association classes) adatainak lekérdezése, majd ezek grafikus megjelenítése. Tulajdonképpen egyszerű, irányítatlan gráfok felrajzolásáról van szó. Erre egy könnyen használható eszköz a Grapviz. Ennek rengeteg paraméterezése meg felhasználási módja van, de legegyszerűbb esetben valami hasonlót kell megírni:

graph WMIAssociations {
  Win32_Class1;
  Win32_Class2;

  Win32_Class1 -- Win32_Class2 [label = "Win32_Association1" ];
}

Tehát fel kell sorolni a gráf csomópontjait (= WMI osztályok) és a gráf éleit (= kapcsolóosztályok). A kapcsolóosztályokról általában ilyen adatokat tárol a WMI:

> Get-CimClass Win32_SystemProcesses | fl

CimClassName        : Win32_SystemProcesses 
CimSuperClass       : ROOT/cimv2:CIM_SystemComponent 
CimClassProperties  : {GroupComponent, PartComponent}
CimClassQualifiers  : {Aggregation, Association, Locale, UUID...} 
...

(Megjegyzés: a lekérdezésekhez már a PowerShell 3.0-ban megjelent új CIM cmdleteket használom.)

Egy adott tulajdonságnál a Reference típus jelzi, hogy ez egy hivatkozás egy másik osztályra:

> (Get-CimClass Win32_SystemProcesses).CimClassProperties

Name               : GroupComponent 
Value              : 
CimType            : Reference 
Flags              : Property, Key, ReadOnly, NullValue 
Qualifiers         : {Aggregate, read, key, MappingStrings...} 
ReferenceClassName : Win32_ComputerSystem
...

Ezek alapján tehát azokat az osztályokat keressük, amik meg vannak jelölve az Association minősítővel, majd ezeknek a Reference típusú tulajdonságait kell összegyűjteni. Ezt például a következő PowerShell lekérdezéssel lehet megtenni:

Get-CimClass | ? {($_.CimClassName -like "Win32_*") -and !($_.CimClassName -like "Win32_Perf*") -and (($_.CimClassQualifiers | ? {$_.Name -eq "Association"}) -ne $null) } | 
 Sort-Object | % {$s = $_.CimClassName; $_.CimClassProperties | ? {$_.CimType -eq "Reference"} | % { $s += ",$($_.ReferenceClassName)" }; Write-Output "$s" } > association_classes.csv

Megjegyzés: nem kerültek bele a listába a teljesítményszámlálóknak megfelelő Win32_Perf* osztályok.

Az így kapott listából már könnyű összeállítani a Grapviznek szükséges szöveges fájlt. Ha utána ebből képet generálunk, akkor valami hasonló gráfot fogunk kapni:

Visualization of associations in WMI (fragment)

Kapcsolatok WMI osztályok között (részlet)

Az egész ábra elég nagy lett, de arra jó, hogy ha valaki egy adott osztály kapcsolatait akarja gyorsan megkeresni, vagy pedig szeretné megnézni, hogy mik a nagyobb összekapcsolódó csoportok.

Egy Windows 8.1 + PowerShell 4.0 gépen lefuttatva így néz ki az egész gráf:

Kapcsolatok WMI osztályok között (root/cimv2 névtér)

Kapcsolatok WMI osztályok között (root/cimv2 névtér)

Jó böngészést!

Summary:  The above figure was generated with a few lines of PowerShell and Graphviz. It shows the associations between WMI classes, and visualizes the connections between the different Win32_* classes. Click on the above figure for a more detailed view!

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>