2009-05-13 4 views
16

Что является лучшим для определения ОС Microsoft, на котором размещается приложение ASP.NET с использованием System.Environment.OSVersion именОпределение ОС с помощью Environment.OSVersion

Мне нужен пример для Windows XP, Windows Server 2003 и Windows Vista

Вот что я пытаюсь сделать с помощью псевдокода

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

ответ

16

должно работать. Но почему вас это волнует? Только для информационных целей при регистрации или вы ищете фактические возможности, присутствующие на целевой платформе?

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 
} 
+0

Мне нужно сгенерировать правильную строку пользовательского агента IE, на основе которой ОС размещает мою службу Windows –

+0

Не достаточна ли версия майора/младшего номера? : Mozilla/4.0 (совместимый; MSIE 7.0b; Windows NT 6.0) – Michael

+4

- есть ли вообще способ разграничения между XP64 и Server 2003? – Patrick

2
if(Environment.OSVersion.Version.Major > 5) { /* vista and above */ } 
+0

мне нужно делать разные вещи для каждой версии ОС. Я думал о переключении или если/else заявление –

+0

Неверный ответ! Это должно быть: if (Environment.OSVersion.Version.Major> 6) {/ * vista и выше * /} – Gerrit

10

не полный список, но получил от этого http://support.microsoft.com/kb/304283:

 
+--------------------------------------------------------------+ 
|   |Windows|Windows|Windows|Windows NT|Windows|Windows| 
|   | 95 | 98 | Me | 4.0 | 2000 | XP | 
+--------------------------------------------------------------+ 
|PlatformID | 1  | 1  | 1  | 2  | 2  | 2  | 
+--------------------------------------------------------------+ 
|Major  |  |  |  |   |  |  | 
| version | 4  | 4  | 4  | 4  | 5  | 5  | 
+--------------------------------------------------------------+ 
|Minor  |  |  |  |   |  |  | 
| version | 0  | 10 | 90 | 0  | 0  | 1  | 
+--------------------------------------------------------------+ 

Edit: Обратите внимание, информация, выдаваемая System.Environment.OSVersion может быть ненадежным, если приложение работает в режиме совместимости.

Edit2: Я бы порекомендовал вам просто сделать его настраиваемым значение в вашем приложении - это путь ваш код не нуждается в перекомпиляции, когда новая ОС выходит, например, Windows 7.

+0

Я согласен со вторым предложением (Edit 2 note). –

+0

Попытка понять это для Windows 10 ... –

+0

Для обновленного списка эта страница полезна [Версия операционной системы] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832%28v= vs.85% 29.aspx). – Joseph

3

Если вы не должны быть конкретными о R2 серверных изданий, более простая альтернатива:

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

скопирован из here.

Чтобы быть более конкретным ваши варианты,

  1. WMI, вы будете иметь какой-то ручной разборе. Не уверен, что пользовательские привилегии будут вредить пользователям, не являющимся администраторами.

  2. GetVersionEx, как описано в this answer.

  3. Проверка ProductName на

    HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ 
    
Смежные вопросы