If you dont have to be specific about R2 of server editions, a simpler alternative is:
enum OS { _2000, XP, Server2003, Vista, Server2008, _7, Server2012, _8 }
const int OS_ANYSERVER = 29;
[DllImport("shlwapi.dll", SetLastError = true, EntryPoint = "#437")]
static extern bool IsOS(int os);
static bool isWindowsServer = IsOS(OS_ANYSERVER);
public static OS GetOS()
{
var version = Environment.OSVersion.Version;
switch (version.Major)
{
case 5:
switch (version.Minor)
{
case 0:
return OS._2000;
case 1:
return OS.XP;
case 2:
return isWindowsServer ? OS.Server2003 : OS.XP;
}
break;
case 6:
switch (version.Minor)
{
case 0:
return isWindowsServer ? OS.Server2008 : OS.Vista;
case 1:
return isWindowsServer ? OS.Server2008 : OS._7;
case 2:
return isWindowsServer ? OS.Server2012 : OS._8;
}
break;
}
throw new Exception("Strange OS");
}
Copied from here.
To be more specific your options are,
WMI, you will have to some manual parsing. Not sure if user privilege is going to hurt non admin users.
GetVersionEx as described in this answer.
Checking for ProductName
at
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\