2

Pobieranie obiektów WMI osadzonych wewnątrz innych jako zmienne klas (C#)


Witajcie,

Dzisiaj szybkie spostrzenie dotyczące właściwości pobierania obiektów WMI będących zawartych wewnątrz obiektów zadanej klasy.
Gdy w podstawowej formie pobieramy kolekcję obiektów WMI spełniających zadane warunki, dostajemy w wyniku obiekt klasy System.Management.ManagementObjectCollection. Każdy z System.Management.ManagementObject posiada wypełnione jedynie podstawowe pola, będące zdefiniowane jako typy proste (int, string, bool). Jednak gdy chcemy odnieść się do pola, które jest typu innej klasy WMI, to dostajemy w rezultacie wartość NULL.
Aby wypełnić takie pole(a) należy wywołać na potrzebnym nam obiekcie metodę Get()
Metoda ta w dokumentacji przedstawiona jest jako popinająca reprezentację .NET klasy System.Management.ManagementBaseObject do rzeczywistej instancji WMI. Może być użyta jako skrótowa forma odwołania się do obiektu klasy poprzez wypełnienie atrybutu Path obiektu po czym wywołanie funkcji Get(). Jednak w naszym przypadku chodzi o ponowne podłączenie, które jako efekt uboczny (skutek wcześniejszej optymalizacji) daje pełną reprezetancję klasy wraz z osadzonymi wewnątrz obiektami (albo tablicami!).
Prezentuje to poniższy przykład:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// for kerberos constrained delegation
ConnectionOptions wmiOptions = new ConnectionOptions();
wmiOptions.Authentication = AuthenticationLevel.PacketPrivacy;
wmiOptions.Impersonation = ImpersonationLevel.Impersonate;
// for connection to remote host
ManagementScope scope = new ManagementScope("\\\\" + serverName + "\\root\\SMS\\Site_" + siteCode, wmiOptions);
// for performing query to wmi
WqlObjectQuery wmiQuery = new WqlObjectQuery(query);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, wmiQuery);
// performing search itself
ManagementObjectCollection Colls = searcher.Get();
ManagementBaseObject[] rules = null;
ManagementObject coll = null;
//retrieving objects from collection, in this example we assume only one result
foreach (ManagementObject o in Colls)
{
      coll = o;
      // coll["CollectionRules"] == null
      coll.Get();
      // after previous call it is filled in
      rules = (ManagementBaseObject[])o["CollectionRules"];
}
Continue...