Определение ОС с помощью Environment.OSVersion
Что лучше всего определить Microsoft OS, которая размещает ваше приложение ASP.NET, используя пространство имен System.Environment.OSVersion
Мне нужен пример для Windows XP, Windows Server 2003 и Windows Vistap >
Вот что я пытаюсь выполнить с помощью псевдокода
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;
}
Ответы
Ответ 1
Следующее должно работать. Но почему вас это волнует? Это только для информационных целей при регистрации или вы ищете фактические возможности, присутствующие на целевой платформе?
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
}
Ответ 2
Не полный список, но получил это от 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 |
+--------------------------------------------------------------+
Изменить: обратите внимание, что информация, возвращаемая System.Environment.OSVersion, может быть ненадежной, если приложение работает в режиме совместимости.
Edit2: я бы порекомендовал вам просто сделать его настраиваемым значением в вашем приложении - таким образом ваш код не нуждается в перекомпиляции, когда выйдет новая ОС, например Windows 7.
Ответ 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");
}
Скопировано из здесь.
Чтобы быть более конкретными, ваши варианты,
-
WMI, вам придется провести ручную разборку. Не уверен, что пользовательские привилегии будут причинять вред пользователям не администраторам.
-
GetVersionEx, как описано в этом ответе.
-
Проверка ProductName
на
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
Ответ 4
if(Environment.OSVersion.Version.Major > 5) { /* vista and above */ }