2 minute read

In this blog, we’ll explore how to use Windows Management Instrumentation (WMI) in C# to gather system information. Specifically, we’ll create a method to retrieve the operating system’s last boot-up time from a remote or local machine using the Win32_OperatingSystem WMI class.

Running Project

WMI Overview

WMI provides a powerful interface for managing and querying system information on Windows operating systems. It allows us to connect to a machine (local or remote), query information, and manage system components. For this example, we will focus on querying the operating system’s last boot-up time.

Code Explanation: Retrieving OS Information

Here’s the full method that demonstrates how to connect to a system and retrieve its operating system info:

private void GetOperatingSystemInfo(string name, string userName, string password)
{
    if (string.IsNullOrEmpty(name))
        throw new ArgumentNullException("name");

    ManagementScope scope;
    
    // Check if username and password are provided for remote connection
    if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password))
    {
        var options = new ConnectionOptions
        {
            Username = userName,
            Password = password
        };
        scope = new ManagementScope("\\\\" + name + "\\root\\cimv2", options);
    }
    else
    {
        // Use default credentials if username and password are not provided
        scope = new ManagementScope("\\\\" + name + "\\root\\cimv2");
    }

    scope.Connect();  // Connect to the system

    var query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");  // WMI Query
    using (var searcher = new ManagementObjectSearcher(scope, query))
    {
        using (var collection = searcher.Get())
        {
            foreach (var o in collection)
            {
                var tempNetworkAdapter = (ManagementObject)o;

                // Retrieve the last boot-up time
                if (tempNetworkAdapter.Properties["LastBootUpTime"].Value != null)
                {
                    LastBootUpTime = ManagementDateTimeConverter.ToDateTime(tempNetworkAdapter.Properties["LastBootUpTime"].Value.ToString());
                }
            }
        }
    }
}

Key Components

  1. ManagementScope:
    • This represents the WMI namespace where the queries will be executed. In this case, \\root\\cimv2 is the standard namespace for system-related queries.
    • If the userName and password are provided, it sets up the ConnectionOptions to authenticate with the remote system. Otherwise, it connects locally or uses default credentials.
  2. ObjectQuery:
    • This defines the WMI query used to retrieve information from the Win32_OperatingSystem class, which contains details about the operating system, including the last boot-up time.
  3. ManagementObjectSearcher:
    • Executes the WMI query against the specified scope and retrieves a collection of management objects that match the query.
  4. ManagementObject:
    • Each result from the WMI query is represented as a ManagementObject, and we use its properties to extract the desired data (in this case, the LastBootUpTime).

Usage Example

To call this method, you can simply pass in the machine name and optional credentials:

GetOperatingSystemInfo("localhost", null, null);  // Local machine without credentials
Console.WriteLine("Last Boot Up Time: " + LastBootUpTime);

Alternatively, for remote systems, you can provide a valid username and password:

GetOperatingSystemInfo("RemoteMachineName", "username", "password");
Console.WriteLine("Last Boot Up Time: " + LastBootUpTime);

What Does This Code Do?

  • Local or Remote Connection: It connects to a machine using either the local credentials or provided username/password for remote systems.
  • Query Execution: The WMI query selects all fields from Win32_OperatingSystem, a class that contains operating system information.
  • Boot Time Retrieval: For each result returned, it extracts the LastBootUpTime property and converts it into a human-readable date format.

GitHub Project

You can find the complete code and additional information in the GitHub repository: OperatingSystemInfoApp

Conclusion

This simple method allows you to retrieve detailed information about the operating system of a local or remote machine using WMI in C#. You can extend this approach to query other system information by modifying the WMI query. This can be particularly useful for remote system monitoring and administration tasks in larger networks.

Leave a comment