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"]; } |