
Introduction
To put it simple: if you want to query hardware device status in .NET, the ManagementObjectSearcher
is your friend. Using it properly is a bit difficult, but it's not that bad.
Background
My task was to create a hardware device health monitor service for a high availability server that runs an important .NET application. Since the environment already had .NET framework installed, I decided to write the health monitor in C#, and that’s where hell broke loose.
I spent a day searching the Internet for a native .NET way to query the hardware status, with no avail. At the end of the day, I found the ManagementObjectSearcher
class, but I didn’t have any clues on the valid search terms. After a long search session, I bumped into a Chinese page (yes, I was that desperate) that showed a list of valid terms and a truckload of Chinese characters.
I wrote a small program that listed all the ManagementObject
s in all the valid ManagementObjectSearcher
s, and bingo! The winner was contestant number 135: Win32_PnPEntity
. With this in my hand, I could Google for the valid attributes and create the following sample.
Using the code
Our code is a simple console application that lists all the available devices and tells whether it's working according to the device status. To use it, you have to reference the System.Management
component.
So, the actual code:
ManagementObjectSearcher deviceList =
new ManagementObjectSearcher("Select Name, Status from Win32_PnPEntity");
if ( deviceList != null )
foreach ( ManagementObject device in deviceList.Get() )
{
string name = device.GetPropertyValue("Name").ToString();
string status = device.GetPropertyValue("Status").ToString();
Console.WriteLine( "Device name: {0}", name );
Console.WriteLine( "\tStatus: {0}", status );
bool working = (( status == "OK" ) || ( status == "Degraded" )
|| ( status == "Pred Fail" ));
Console.WriteLine( "\tWorking?: {0}", working );
}
Points of interest
An advice in advance: if you have to learn anything about the local machine status, try to dig up a WMI namespace for that; looking at the log my first dumping application created, even the question for 42 is there. The only trick is to find the correct query :)