Yesterday I blogged about a class I came across in the SystemInformation namespace called PowerStatus. It was working great for me until I tested it on a machine with three UPS's plugged into it. The three UPS's were not for that machine of course :) they were in a rack with a bunch of controllers etc. We wanted to monitor all three UPS's and find out how much life was left in the weakest, so we can shut down the system and save all data before any of them go.
The problem with Power Status was it seemed to give me an average of all three batteries and on my laptop it got nothing. So I asked my network of developers and Andrew pointed me to WMI (Windows Management Instrumentation). Well there is a wealth of information in there. And it can all be called nativley from .Net. I thought I would post some sample code. Gives me a place to come look for it next time I need something similar.
This code gets a collection of Batteries from the current machine and fills a listbox with their Names and remaining life.
ConnectionOptions options = new ConnectionOptions();
options.Impersonation = ImpersonationLevel.Impersonate;
options.Authentication = AuthenticationLevel.Default;
options.EnablePrivileges = true;
ManagementScope connectScope = new ManagementScope();
connectScope.Path = new ManagementPath(@"\\" + Environment.MachineName + @"\root\CIMV2");
connectScope.Options = options;
connectScope.Connect();
SelectQuery msQuery = new SelectQuery("Select * from WIN32_Battery");
ManagementObjectSearcher searchProcedure = new ManagementObjectSearcher(connectScope, msQuery);
this.listBox1.Items.Clear();
foreach (ManagementObject item in searchProcedure.Get())
{
this.listBox1.Items.Add(item["DeviceID"].ToString() + " - " + item["EstimatedRunTime"].ToString());
}
Notice the query in the middle of this code that is looking in Win32_Battery click here to see what else you can query out there.