Introduction
This is the third article in the series of articles How To: (Almost) Everything In WMI
via C#.
In this article, I'm going to introduce a simple framework that can be used to aggregate property values for any of the hundreds of classes in the WMI
namespace. In the attached example, I have included 30+ hardware classes used for everything from enumerating properties on network client CDRom disk drives to USB Host Controllers. When it comes to probing machines on the network for very detailed hardware information, nothing on the street can compare with WMI
.
In the previous additions, we focused on a way to provide the property values as well as executing WMI
methods. In this article however, we are going to focus on the considerable wealth of knowledge we can obtain by the properties alone.
Included Classes
The following included classes will return a collection of all the properties and values. This only applies to single string
attributes. If you're going to need to aggregate multistring[]
attribute values, then you'll need to wrap that in addition. Noticeably absent from this class listing is Win32_Printer
, which I have left out since it deserves its own article.
Win32_BaseBoard
: Mother board or System Board Win32_Battery
: System Battery Win32_BIOS
: System BIOS Win32_Bus
: Physical System Bus Win32_CDROMDrive
: System Optical Drives Win32_DiskDrive
: System Disks Win32_DMAChannel
: System DMA Channels Win32_Fan
: System Fan Win32_FloppyController
: System Floppy Controllers Win32_FloppyDrive
: System Floppy Drives Win32_IDEController
: System IDE Controllers Win32_IRQResource
: System IRQ Resources Win32_Keyboard
: System Keyboard Win32_MemoryDevice
: System Memory Win32_NetworkAdapter
: Network Adapters Win32_NetworkAdapterConfiguration
: Adapter configuration Win32_OnBoardDevice
: Common Devices built into the System board Win32_ParallelPort
: The Parallel ports Win32_PCMCIAController
: The PCMCIA Laptop bus Win32_PhysicalMedia
: Storage Media such as tapes, etc. Win32_PhysicalMemory
: The physical memory device Win32_PortConnector
: Physical ports such as DB-25 pin male, PS/2, etc. Win32_Bus
: Physical System Bus Win32_PortResource
: I/O ports on a system Win32_POTSModem
: Plain Old Telephone System Modem Devices Win32_Processor
: Processor specifications Win32_SCSIController
: System SCSI bus Win32_SerialPorts
: Serial Ports Win32_SerialPortConfiguration
: Port Configuration Win32_SoundDevice
: Sound Devices Win32_SystemEnclosure
: System Details Win32_TapeDrive
: Physical Tape Drives Win32_TemperatureProbe
: Heat Statistics Win32_UninterruptiblePowerSupply
: UPS details Win32_USBController
: USB Controller on a system Win32_USBHub
: USB Hub Win32_VideoController
: Physical Video Controller Win32_VoltageProbe
: Voltage Statistics
Using the Attached Code
Methods (Local Machine or Remote Machine)
GetPropertyValues()
- Gets the WMI
Class Properties values of the object
Instantiate the Local Provider
Connection wmiConnection = new Connection();
Instantiate the Remote Provider
Connection wmiConnection = new Connection("neal.bailey",
"3l!t3p@$$",
"BAILEYSOFT",
"192.168.2.100");
Using the Classes
Using the classes is very simple. You just create a new instance of the WMI
connection and then send the connection object into the WMI
class you want to use. All the classes have the single method GetPropertyValues()
.
Connection wmiConnection = new Connection();
Win32_Battery b = new Win32_Battery(wmiConnection);
foreach (string property in b.GetPropertyValues())
{
Console.WriteLine(property);
}
Extending To Add Your Own WMI Classes
This solution is a simple framework that anyone can use to add and remove the WMI classes they need to enumerate.
Step One: Find some classes you want from the Microsoft WMI SDK.
Step Two: Create a class with the same name as the WMI
class (example Win32_Printer
) and paste the following code into it:
using System;
using System.Collections.Generic;
using System.Text;
namespace baileysoft.Wmi
{
class Win32_Printer : IWMI
{
Connection WMIConnection;
public Win32_Printer(Connection WMIConnection)
{
this.WMIConnection = WMIConnection;
}
public IList{string} GetPropertyValues()
{
string className = System.Text.RegularExpressions.Regex.Match(
this.GetType().ToString(), "Win32_.*").Value;
return WMIReader.GetPropertyValues(WMIConnection,
"SELECT * FROM " + className,
className);
}
}
}
Step Three: Create a new tag in the settings.xml file for your class and enter the properties you want to enumerate (those ones in the SDK). Refer to the settings.xml file for the existing examples.
Conclusion
The WMI
(Windows Management Instrumentation) provider is considerably slower than the native .NET classes and it may be easier to do this all with .NET classes but there are a lot of commercial solutions out there that do this exact same thing and surprise, surprise they use WMI for it. The included example solution demonstrates how to create a very powerful, extensible WMI
hardware management solution.
History
- Submitted: 03 April, 2007
- Fixed formatting and grammar: 04 April, 2007
I'm a professional .NET software developer and proud military veteran. I've been in the software business for 20+ years now and if there's one lesson I have learned over the years, its that in this industry you have to be prepared to be humbled from time to time and never stop learning!