Windows Management Instrumentation in C#

By FoxLearn 12/30/2024 9:35:44 AM   91
This article provides an overview of Windows Management Instrumentation (WMI) technology and demonstrates how to use WMI with the WMI Query Language (WQL) in C#.

What is WMI?

Windows Management Instrumentation (WMI) is a Microsoft COM-based technology designed to retrieve system-related information.

Some of the hardware information you can retrieve using WMI includes:

  • Hard Drive Serial Number
  • Hard Drive Size and Free Space
  • Processor Details (ID, Clock Speed, Socket Type)
  • Network Adapter MAC Address and IP Configuration

To interact with WMI in a .NET application, we can use the System.Management namespace, which provides access to WMI functionality.

Querying Logical Disks

The following C# code snippet shows how to query the system for a list of logical disks: 

static List<string> GetDiskNames()
{
    List<string> diskNames = new List<string>();
    SelectQuery query = new SelectQuery("Win32_LogicalDisk");
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);

    foreach (ManagementObject disk in searcher.Get())
    {
        diskNames.Add(disk["DeviceID"].ToString());
    }

    return diskNames;
}

In this example, the SelectQuery class is used to form the WQL query, which retrieves information about the logical disks on the system.

Retrieving Disk Metadata

You can fetch detailed information about the system's fixed disks, including disk size, free space, and disk name, as shown below:

static void GetDiskMetadata()
{
    ManagementScope scope = new ManagementScope();
    ObjectQuery query = new ObjectQuery("SELECT FreeSpace, Size, Name FROM Win32_LogicalDisk WHERE DriveType=3");
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
    ManagementObjectCollection results = searcher.Get();

    foreach (ManagementObject disk in results)
    {
        Console.WriteLine($"Disk Name: {disk["Name"]}");
        Console.WriteLine($"Free Space: {disk["FreeSpace"]}");
        Console.WriteLine($"Disk Size: {disk["Size"]}");
        Console.WriteLine("---------------------------------------------------");
    }
}

Retrieving Hard Disk Serial Number

To obtain the serial number of a hard disk, use the following code snippet:

static string GetDiskSerialNumber(string drive = "C")
{
    ManagementObject disk = new ManagementObject($"Win32_LogicalDisk.DeviceID=\"{drive}:\"");
    disk.Get();
    return disk["VolumeSerialNumber"].ToString();
}

Fetching Processor Information

You can also retrieve processor information, such as the processor ID and current clock speed:

static void GetProcessorInfo()
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");
    foreach (ManagementObject processor in searcher.Get())
    {
        string processorId = processor["ProcessorId"].ToString();
        int clockSpeed = Convert.ToInt32(processor["CurrentClockSpeed"]);
        Console.WriteLine($"Processor ID: {processorId}");
        Console.WriteLine($"Clock Speed: {clockSpeed} MHz");
    }
}

WMI is a powerful tool for accessing system hardware information in a .NET application. By using WQL queries, you can retrieve detailed metadata about the system, such as disk size, free space, processor details, and more.