Retrieving hardware information with WMI

Downloads

Demo project with source - 28 Kb

Introduction

Windows Management Instrumentation (WMI) is a scalable system management infrastructure that uses a single consistent, standards-based, extensible, object-oriented interface. WMI provides you with a standard way to interact with system management information and the underlying WMI APIs. WMI is used primarily by system management application developers and administrators to access and manipulate system management information.

The purpose of WMI is to provide a standardized means for managing your computer system, be it a local computer or all the computers in an enterprise. In its simplest terms, management is little more than the collecting data about the state of a managed object on the computer system and altering the state of the managed object by changing the data stored about the object. A managed object can be a hardware entity, such as a memory array, port, or disk drive. It can also be a software entity, such as a service, user account, or page file.

WMI can manage the many components of a computer system. In managing a hard disk, you can use WMI to monitor the amount of free space remaining on the disk. You could also use WMI to remotely alter the state of the drive by deleting files, changing file security, or partitioning or formatting the drive.

WMI is not only powerfull tool to collect system information, it is also very easy to use. Existing scripting WMI interface makes it possible to be used for system administrators and web-designers as well as for skilled programmers.

Presented application displays hardware information in HTML page and uses VBScript as back end programming language.

First of all, we set strComputer (name of the computer to get information from) to "." - current computer and write function GetWMIServices() - this function will be used in all procedures that get information from WMI and can be modified to get WMI services from another computer.

Then we define some function that will format output - WMIDateStringToDate(), DisplayOutputHeader(), DisplayOutput(), GetTableHeader(), GetTableFooter(), GetRow(). With these functions we will have standartized output.

For example, the code for retrieving and displaying processor(s) information is:

Function ShowProcessorInfo()
	On Error Resume Next
	DisplayOutputHeader("Processor - Win32_Processor")
	str = ""
	Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
	Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor")
	For Each objItem in colItems
	    str = str & GetTableHeader()
	    str = str & GetRow("Address Width", objItem.AddressWidth)
	    str = str & GetRow("Architecture", objItem.Architecture)
	    str = str & GetRow("Availability", objItem.Availability)
	    str = str & GetRow("CPU Status", objItem.CpuStatus)
	    str = str & GetRow("Current Clock Speed", objItem.CurrentClockSpeed)
	    str = str & GetRow("Data Width", objItem.DataWidth)
	    str = str & GetRow("Description", objItem.Description)
	    str = str & GetRow("Device ID", objItem.DeviceID)
	    str = str & GetRow("Ext Clock", objItem.ExtClock)
	    str = str & GetRow("Family", objItem.Family)
	    str = str & GetRow("L2 Cache Size", objItem.L2CacheSize)
	    str = str & GetRow("L2 Cache Speed", objItem.L2CacheSpeed)
	    str = str & GetRow("Level", objItem.Level)
	    str = str & GetRow("Load Percentage", objItem.LoadPercentage)
	    str = str & GetRow("Manufacturer", objItem.Manufacturer)
	    str = str & GetRow("Maximum Clock Speed", objItem.MaxClockSpeed)
	    str = str & GetRow("Name", objItem.Name)
	    str = str & GetRow("PNP Device ID", objItem.PNPDeviceID)
	    str = str & GetRow("Processor Id", objItem.ProcessorId)
	    str = str & GetRow("Processor Type", objItem.ProcessorType)
	    str = str & GetRow("Revision", objItem.Revision)
	    str = str & GetRow("Role", objItem.Role)
	    str = str & GetRow("Socket Designation", objItem.SocketDesignation)
	    str = str & GetRow("Status Information", objItem.StatusInfo)
	    str = str & GetRow("Stepping", objItem.Stepping)
	    str = str & GetRow("Unique Id", objItem.UniqueId)
	    str = str & GetRow("Upgrade Method", objItem.UpgradeMethod)
	    str = str & GetRow("Version", objItem.Version)
	    str = str & GetRow("Voltage Caps", objItem.VoltageCaps)
	    str = str & GetTableFooter()
	Next
	DisplayOutput(str)
End Function

HardwareInfo retrieves also information about baseboard, batteries, BIOS, memory settings, PnP devices, ports and some others.

At the last point, cutomize look of the application with cascading style sheet - the easest way to create good looking interface.

Application can run as is - just double-click on index.hta file or it can be compiled into single file.

As you can see, retrieving information about installed hardware items with Windows Management Instrumentation is very easy and requires minimal programming skills.

HardwareInformation application is written as HTA (HTML application) and compiled with compiler provided with www-Sharp.ClrHost (http://www-sharp.com/clrhost) that is available for free. www-Sharp (http://www-sharp.com) includes WMI viewer that can be used to visual explore WMI classes and properties and write powerfull WMI applications.