Question: I am currently working on a C# project. I want to collect users statistics to better develop the software. I am using the `Environment.OS` feature of C# but its only showing the OS name as something like **Microsoft Windows NT**

What I want to be able to **retrieve** is the *actual known name of the OS* like whether it is `Windows XP, Windows Vista or Windows 7` and etc. 

Is this possible?

Answer: 
You should really try to avoid WMI for local use. It is very convenient but you pay dearly for it in terms of performance. Think laziness tax! 

Kashish's answer about the registry does not work on all systems. Code below should and also includes the service pack:

```
    public string HKLM_GetString(string path, string key)
    {
        try
        {
            RegistryKey rk = Registry.LocalMachine.OpenSubKey(path);
            if (rk == null) return "";
            return (string)rk.GetValue(key);
        }
        catch { return ""; }
    }

    public string FriendlyName()
    {
        string ProductName = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName");
        string CSDVersion = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CSDVersion");
        if (ProductName != "")
        {
            return (ProductName.StartsWith("Microsoft") ? "" : "Microsoft ") + ProductName +
                        (CSDVersion != "" ? " " + CSDVersion : "");
        }
        return "";
    }

```
Though this is not a fully C# way of detecting the OS Name, below code works for my needs-

```
public static string GetFriendlyOSName()
    {
        System.Diagnostics.Process cmd = new System.Diagnostics.Process();
        cmd.StartInfo.FileName = "cmd.exe";
        cmd.StartInfo.Arguments = "/C systeminfo | findstr /c:\"OS Name\"";
        cmd.StartInfo.RedirectStandardOutput = true;
        cmd.StartInfo.UseShellExecute = false;
        cmd.StartInfo.CreateNoWindow = true;
        cmd.Start();
        cmd.WaitForExit();
        string output = cmd.StandardOutput.ReadToEnd();
        cmd.Close();
        return output.Split(new[] { ':' }, 2)[1].Trim();
    }

```

Note:

1. This code works for only Windows OS.
2. The code is tested only on Windows 10, 11.