Odczytywanie informacji o zasobach komputera – WMI i C#

Zastanawialiście się kiedyś, jak dostać się do szczegółowych informacji na temat komputera przy użyciu .NET’a? Do tego celu służy WMI  (Windows Management Instrumentation). Czym konkretnie jest WMI? Jak mówi polska Wikipedia, jest to: „zestaw protokołów i rozszerzeń systemu Windows umożliwiających zarządzanie i dostęp do zasobów komputera, takich jak adaptery sieciowe, aktualnie otwarte programy, lista procesów, odczyty z wbudowanych czujników temperatury, odczytów woltomierzy itp.”. Co ciekawe można korzystać z tego mechanizmu także zdalnie. Dostęp do WMI z poziomu .NET’a zapewnia nam przestrzeń nazw System.Management. Niezbędne, więc będzie dodanie do niej referencji w projekcie. Z dobrodziejstw WMI możemy korzystać nie tylko poprzez C#. Możliwe jest korzystanie z tego mechanizmu również z poziomu Visual Basica .NET, VBScript, F#, PowerShell’a, C++ i pewnie także z innych 😉

Jak korzystać z WMI w C#?

Tak jak pisałem wcześniej, wystarczy dodać referencję do przestrzeni nazw System.Management. Tylko co dalej? Trzeba przecież wiedzieć, jak korzystać z tego całego WMI. Oczywiście można zawsze skorzystać z dokumentacji. Jednak ilość przestrzeni nazw i klas może przyprawić o ból głowy. Jak zatem sobie poradzić? Z pomocą może przyjść narzędzie WMI Code Creator. Jest to prosta aplikacja umożliwiająca generowanie kodu WMI, dla trzech języków programowania tj. Visual Basica .NET, VBScript i C#.

Aplikacja pozwala na wybranie konkretnej przestrzeni nazw, klasy i właściwości. Na tej podstawie generuje kod w wybranym przez nas języku i pozwala nawet na wykonanie z jej poziomu kodu i odczytania wyniku, jaki ten zwróci. Możliwe jest też przechwytywanie zdarzeń takich jak np. zmiana poziomu głośności. Do ich obsługi także można wygenerować kod. Jednak tutaj opiszę tylko kwestię odczytywania samych „suchych” danych. Większość dotyczących sprzętu znajdziemy w przestrzeni nazw root\CIMV2. Znajdziemy tu masę różnych klas, jednak ich nazwy są dosyć jednoznaczne. Przykładem może być Win32_BIOS i jej właściwości:

Po wybraniu i kliknięciu „Search for Property Values” zostaną wyświetlone ich wartości. Nie zawsze jednak wszystkie właściwości są dostępne. Ich dostępność zależy w dużej mierze od konkretnego komputera i zainstalowanego na nim sprzętu. Czasami dane mogą nie pokrywać się z tym, co sugeruje nazwa właściwości. Jak widać w moim przypadku BIOSVersion i BuildNumber nie zwracają niczego, a z kolei Caption i Description zwracają te same dane… Jednak nie oznacza to, że właściwość BuildNumber nie „działa”, bo na innym komputerze może normalnie zwrócić dane. Taki stan rzeczy to nie tyle wina WMI, co producentów sprzętu – najwyraźniej nie „wstukują” wszystkich danych w swoje chipy. Co do wartości BIOSVersion – ta nie wyświetla się w tej aplikacji (chyba)dlatego, że kod zwraca tablicę stringów – twórcy foreach’a nie użyli? 😉 Po skopiowaniu kodu do VS pozycja ta zwraca normalnie dane.

Co do samego kodu to nie wiem jak dla Was, ale dla mnie nie wydaje się zbyt elegancki… Może sam nie jestem mistrzem pisania dobrego kodu, ale według mnie lepiej zrobić to w ten sposób:

Tworzymy metodę, która będzie zwracać dane z klasy Win32_BIOS. Jako argument przyjmuje ona nazwę właściwości z tejże klasy. W przypadku wystąpienia błędu jest on po prostu zwracany… Krócej i bardziej przejrzyście 😉

Tyle ode mnie. Zachęcam do pobawienia się tym narzędziem oraz samym WMI, bo czasami jest naprawdę przydatne. Jeżeli macie jakieś uwagi/pytania to zachęcam do komentowania 🙂

612 total views, 1 views today