Interacting with the Hardware using C# 4.0


Get OS, Service Pack Information

Use the System.Environment.OSVersion


OperatingSystem os = System.Environment.OSVersion;
Console.WriteLine("Platform: {0}", os.Platform);
Console.WriteLine("Service Pack: {0}", os.ServicePack);
Console.WriteLine("Version: {0}", os.Version);
Console.WriteLine("VersionString: {0}", os.VersionString);
Console.WriteLine("CLR Version: {0}", System.Environment.Version); 

This produces the following output (on my Windows 7 system):

Platform: Win32NT
Service Pack:
Version: 6.1.7600.0
VersionString: Microsoft Windows NT 6.1.7600.0
CLR Version: 4.0.21006.1

The version information is in a struct, so you can make decisions based on version or subversion values.

Get CPU and Other Hardware Information

using System;
using System.Management;
using System.Windows.Forms;
namespace HardwareInfo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Machine: {0}", Environment.MachineName);
            Console.WriteLine("# of processors (logical): {0}", Environment.ProcessorCount);
            Console.WriteLine("# of processors (physical): {0}", CountPhysicalProcessors());
            Console.WriteLine("RAM installed: {0:N0} bytes", CountPhysicalMemory());
            Console.WriteLine("Is OS 64-bit? {0}", Environment.Is64BitOperatingSystem);
            Console.WriteLine("Is process 64-bit? {0}", Environment.Is64BitProcess);
            Console.WriteLine("Little-endian: {0}", BitConverter.IsLittleEndian);
            foreach (Screen screen in System.Windows.Forms.Screen.AllScreens)
            {
                Console.WriteLine("Screen {0}", screen.DeviceName);
                Console.WriteLine("\tPrimary {0}", screen.Primary);
                Console.WriteLine("\tBounds: {0}", screen.Bounds);
                Console.WriteLine("\tWorking Area: {0}", screen.WorkingArea);
                Console.WriteLine("\tBitsPerPixel: {0}", screen.BitsPerPixel);
            }
            Console.ReadKey();
        }
        private static UInt32 CountPhysicalProcessors()
        {
            //you must add a reference to the System.Management assembly
            ManagementObjectSearcher objects =
            new ManagementObjectSearcher(
            "SELECT * FROM Win32_ComputerSystem");
            ManagementObjectCollection coll = objects.Get();
            foreach (ManagementObject obj in coll)
            {
                return (UInt32)obj["NumberOfProcessors"];
            }
            return 0;
        }
        private static UInt64 CountPhysicalMemory()
        {
            ManagementObjectSearcher objects =
            new ManagementObjectSearcher(
            "SELECT * FROM Win32_PhysicalMemory");
            ManagementObjectCollection coll = objects.Get();
            UInt64 total = 0;
            foreach (ManagementObject obj in coll)
            {
                total += (UInt64)obj["Capacity"];
            }
            return total;
        }
    }
}

Next Recommended Readings