Сразу же хотелось бы сказать, что существует несколько способов решения данной задачи. В этой статье будут рассмотрены примеры с использование библиотек .NET и реестра, а в следующей статье WinAPI и WMI.
Для определения текущей версии Windows воспользуемся классом Environment пространства имён System.
Выполним следующий код
В результате получим текущую версию операционной системы в линейке WINDOWS NT, например:
Полученная строка состоит из компонентом разделенных точкой, минимальное количество компонентов два. Обязательными являются основной номер версии
Чтобы получить любое из этих двух значений программно, можно использовать следующий код
И так мы смогли определить версию Windows и получили оба числа номера версии. Теперь можно воспользоваться специальной таблицей и получить маркетинговое имя операционной системы.
Всё это можно выполнить и программным путём
Вместо if else можно использовать конструкцию
Код работает, но есть один нюанс. Операционные системы Windows могут быть нескольких типов: серверные (Server) Windows Server 2003, 2008, 2012 и так называемые рабочие станции (Workstation) xp, 7, 8.
Если выполнить наш код в одной из серверных версии ос, например в Windows Server 2012, то в результате получим Windows 8. Как видно на картинке ниже, это происходит, потому что основной и дополнительный номер версии у рабочих станций и сервера совпадает.
Тогда возникает вопрос, как можно определить, что перед нами рабочая станция, а не сервер?
Добавим в наш исходник ещё одну проверку, которая будет находить в реестре ключ
Если Вы не знаете, что такое реестр Windows и как с ним работать, то можете прочитать статью Работа с реестром Windows.
Вызов
С помощью реестра так же можно и сразу же определить имя операционной системы, не используя никаких дополнительных проверок.
Так как переменная name содержит строку вида
или
А не просто xp, 7 или 8, то применяем метод
Так же с помощью этого кода можно получить и другие полезные значения, заменив ключ
Для определения текущей версии Windows воспользуемся классом Environment пространства имён System.
C#:
using System;
Выполним следующий код
C#:
Console.WriteLine(Environment.OSVersion.Version);
Код:
6.1.xxxx.xxxx
Major version
в данном примере число 6 и дополнительный номер версии Minor version
сборки число 1.Чтобы получить любое из этих двух значений программно, можно использовать следующий код
C#:
int majorVer = Environment.OSVersion.Version.Major;
int minorVer = Environment.OSVersion.Version.Minor;
И так мы смогли определить версию Windows и получили оба числа номера версии. Теперь можно воспользоваться специальной таблицей и получить маркетинговое имя операционной системы.
Версия | Имя |
5.1 | Windows Xp 32x |
5.2 | Windows Xp 64x |
6.0 | Windows Vista |
6.1 | Windows 7 |
6.2 | Windows 8 |
Всё это можно выполнить и программным путём
C#:
class Program
{
static void Main (string [] args)
{
Console.WriteLine(GetWinVer(Environment.OSVersion.Version));
Console.ReadLine();
}
static string GetWinVer (Version ver)
{
if (ver.Major == 6 & ver.Minor == 1)
return "Windows 7";
else if (ver.Major == 6 & ver.Minor == 2)
return "Windows 8";
else
return "Другая ОС";
}
}
switch case
если она вам больше нравится.Код работает, но есть один нюанс. Операционные системы Windows могут быть нескольких типов: серверные (Server) Windows Server 2003, 2008, 2012 и так называемые рабочие станции (Workstation) xp, 7, 8.
Если выполнить наш код в одной из серверных версии ос, например в Windows Server 2012, то в результате получим Windows 8. Как видно на картинке ниже, это происходит, потому что основной и дополнительный номер версии у рабочих станций и сервера совпадает.
Версия | Workstation | Server |
5.1 | Windows Xp 32x | |
5.2 | Windows Xp 64x | Windows Server 2003 |
6.0 | Windows Vista | Windows Server 2008 |
6.1 | Windows 7 | Windows Server 2008 R2 |
6.2 | Windows 8 | Windows Server 2012 |
Тогда возникает вопрос, как можно определить, что перед нами рабочая станция, а не сервер?
Добавим в наш исходник ещё одну проверку, которая будет находить в реестре ключ
ProductType
и получать одно из его значений.Значения ключа | |
WinNT | рабочая станция |
LanmanNT | контролер домена |
ServerNT | Сервер |
C#:
static string GetProductType()
{
string value = String.Empty;
string key=@"SYSTEM\CurrentControlSet\Control\ProductOptions";
using(RegistryKey regKey=Registry.LocalMachine.OpenSubKey(key))
{
if (regKey != null)
{
try
{
switch (regKey.GetValue("ProductType").ToString())
{
case "WinNT" : value = "work"; break;
case "LanmanNT": value = "domen"; break;
case "ServerNT": value = "server"; break;
default: value = "other"; break;
}
}
catch (Exception ex)
{
return ex.Message;
}
return value;
}
else
return "не удалось найти указанный ключ";
}
}
Вызов
C#:
class Program
{
public static void Main()
{
if (GetProductType() == "work")
{
Console.WriteLine(GetWinVer(Environment.OSVersion.Version));
}
else
Console.WriteLine("сервер");
Console.ReadLine();
}
static string GetProductType()
{
//....
}
static string GetWinVer(Version ver)
{
//....
}
}
С помощью реестра так же можно и сразу же определить имя операционной системы, не используя никаких дополнительных проверок.
C#:
static string GetWinName()
{
string key = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion";
using(RegistryKey regKey=Registry.LocalMachine.OpenSubKey(key))
{
if (regKey != null)
{
try
{
string name = regKey.GetValue("ProductName").ToString();
if (name == "") return "значение отсутствует";
if (name.Contains("XP"))
return "XP";
else if (name.Contains("7"))
return "Windows 7";
else if (name.Contains("8"))
return "Windows 8";
else
return "неизвестная версия Windows";
}
catch (Exception ex)
{
return ex.Message;
}
}
else
return "Не удалось получить значение ключа в реестре";
}
}
Так как переменная name содержит строку вида
Windows 7 Home
или
Microsoft Windows XP
А не просто xp, 7 или 8, то применяем метод
contains
который позволяет определить содержится ли нужное нам значение в строке.Так же с помощью этого кода можно получить и другие полезные значения, заменив ключ
ProductName
например на PathName
тогда получим путь, куда установлена операционная система Windows или на ProductId
тогда получим ключ продукта. Все остальные доступные значения можно найти в реестре, пройдя по указанному пути вручную.
Последнее редактирование: