Detect Windows version in .NET
System.Environment.OSVersion
has the information you need for distinguishing most Windows OS major releases, but not all. It consists of three components which map to the following Windows versions:
+------------------------------------------------------------------------------+| | PlatformID | Major version | Minor version |+------------------------------------------------------------------------------+| Windows 95 | Win32Windows | 4 | 0 || Windows 98 | Win32Windows | 4 | 10 || Windows Me | Win32Windows | 4 | 90 || Windows NT 4.0 | Win32NT | 4 | 0 || Windows 2000 | Win32NT | 5 | 0 || Windows XP | Win32NT | 5 | 1 || Windows 2003 | Win32NT | 5 | 2 || Windows Vista | Win32NT | 6 | 0 || Windows 2008 | Win32NT | 6 | 0 || Windows 7 | Win32NT | 6 | 1 || Windows 2008 R2 | Win32NT | 6 | 1 || Windows 8 | Win32NT | 6 | 2 || Windows 8.1 | Win32NT | 6 | 3 |+------------------------------------------------------------------------------+| Windows 10 | Win32NT | 10 | 0 |+------------------------------------------------------------------------------+
For a library that allows you to get a more complete view of the exact release of Windows that the current execution environment is running in, check out this library.
Important note: if your executable assembly manifest doesn't explicitly state that your exe assembly is compatible with Windows 8.1 and Windows 10.0, System.Environment.OSVersion
will return Windows 8 version, which is 6.2, instead of 6.3 and 10.0! Source: here.
Update: In .NET 5.0 and later, System.Environment.OSVersion
always returns the actual OS version. For more information, see Environment.OSVersion returns the correct operating system version.
I used this when I had to determine various Microsoft Operating System versions:
string getOSInfo(){ //Get Operating system information. OperatingSystem os = Environment.OSVersion; //Get version information about the os. Version vs = os.Version; //Variable to hold our return value string operatingSystem = ""; if (os.Platform == PlatformID.Win32Windows) { //This is a pre-NT version of Windows switch (vs.Minor) { case 0: operatingSystem = "95"; break; case 10: if (vs.Revision.ToString() == "2222A") operatingSystem = "98SE"; else operatingSystem = "98"; break; case 90: operatingSystem = "Me"; break; default: break; } } else if (os.Platform == PlatformID.Win32NT) { switch (vs.Major) { case 3: operatingSystem = "NT 3.51"; break; case 4: operatingSystem = "NT 4.0"; break; case 5: if (vs.Minor == 0) operatingSystem = "2000"; else operatingSystem = "XP"; break; case 6: if (vs.Minor == 0) operatingSystem = "Vista"; else if (vs.Minor == 1) operatingSystem = "7"; else if (vs.Minor == 2) operatingSystem = "8"; else operatingSystem = "8.1"; break; case 10: operatingSystem = "10"; break; default: break; } } //Make sure we actually got something in our OS check //We don't want to just return " Service Pack 2" or " 32-bit" //That information is useless without the OS version. if (operatingSystem != "") { //Got something. Let's prepend "Windows" and get more info. operatingSystem = "Windows " + operatingSystem; //See if there's a service pack installed. if (os.ServicePack != "") { //Append it to the OS name. i.e. "Windows XP Service Pack 3" operatingSystem += " " + os.ServicePack; } //Append the OS architecture. i.e. "Windows XP Service Pack 3 32-bit" //operatingSystem += " " + getOSArchitecture().ToString() + "-bit"; } //Return the information we've gathered. return operatingSystem;}
Source: here
I use the ManagementObjectSearcher
of namespace System.Management
Example:
string r = "";using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")){ ManagementObjectCollection information = searcher.Get(); if (information != null) { foreach (ManagementObject obj in information) { r = obj["Caption"].ToString() + " - " + obj["OSArchitecture"].ToString(); } } r = r.Replace("NT 5.1.2600", "XP"); r = r.Replace("NT 5.2.3790", "Server 2003"); MessageBox.Show(r);}
Do not forget to add the reference to the Assembly
System.Management.dll
and put the using:using System.Management;
Result: