Determine el sistema operativo utilizando Environment.OSVersion

¿Qué es lo mejor para determinar el sistema operativo de Microsoft que hospeda su aplicación ASP.NET utilizando el espacio de nombres System.Environment.OSVersion

Necesito un ejemplo para Windows XP, Windows Server 2003 y Windows Vista

Esto es lo que estoy tratando de lograr usando pseudocódigo

 switch(/* Condition for determining OS */) { case "WindowsXP": //Do Windows XP stuff break; case "Windows Server 2003": //Do Windows Server 2003 stuff break; case "Windows Vista": //Do Windows Vista stuff break; } 

Lo siguiente debería funcionar Pero, ¿por qué te importa? ¿Es sólo para fines informativos en el registro o está buscando capacidades reales presentes en la plataforma objective?

 if (Environment.OSVersion.Version.Major == 5) { if (Environment.OSVersion.Version.Minor == 1) { // XP } else if (Environment.OSVersion.Version.Minor == 2) { // Server 2003. XP 64-bit will also fall in here. } } else if (Environment.OSVersion.Version.Major >= 6) { // Vista on up } 

No es una lista completa, pero obtuvo esto desde http://support.microsoft.com/kb/304283 :

 + ------------------------------------------------- ------------- +
 |  | Windows | Windows | Windows | Windows NT | Windows | Windows |
 |  |  95 |  98 |  Yo |  4.0 |  2000 |  XP |
 + ------------------------------------------------- ------------- +
 | PlatformID |  1 |  1 |  1 |  2 |  2 |  2 |
 + ------------------------------------------------- ------------- +
 | Mayor |  |  |  |  |  |  |
 |  versión |  4 |  4 |  4 |  4 |  5 |  5 |
 + ------------------------------------------------- ------------- +
 | Menor |  |  |  |  |  |  |
 |  versión |  0 |  10 |  90 |  0 |  0 |  1 |
 + ------------------------------------------------- ------------- +

Editar: tenga en cuenta que la información devuelta por System.Environment.OSVersion puede no ser confiable si la aplicación se está ejecutando en modo de compatibilidad.

Edit2: recomendaría que simplemente establezca un valor configurable en su aplicación; de este modo, su código no necesitará recomstackrse cuando salga un nuevo sistema operativo, por ejemplo, Windows 7.

Si no tiene que ser específico sobre R2 de ediciones de servidor, una alternativa más simple es:

 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"); } 

Copiado desde aquí

Para ser más específico, tus opciones son,

  1. WMI, deberás realizar un análisis manual. No estoy seguro de si el privilegio del usuario perjudicará a los usuarios que no sean administradores.

  2. GetVersionEx como se describe en esta respuesta .

  3. Comprobando ProductName en

     HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ 
 if(Environment.OSVersion.Version.Major > 5) { /* vista and above */ }