Как определить версию Windows, используя язык C#

BKeaton

Green Team
18.07.2018
204
339
BIT
123
Сразу же хотелось бы сказать, что существует несколько способов решения данной задачи. В этой статье будут рассмотрены примеры с использование библиотек .NET и реестра, а в следующей статье WinAPI и WMI.
Для определения текущей версии Windows воспользуемся классом Environment пространства имён System.
C#:
using System;


Выполним следующий код
C#:
Console.WriteLine(Environment.OSVersion.Version);
В результате получим текущую версию операционной системы в линейке WINDOWS NT, например:
Код:
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.1Windows Xp 32x
5.2Windows Xp 64x
6.0Windows Vista
6.1Windows 7
6.2Windows 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 "Другая ОС";
}
}
Вместо if else можно использовать конструкцию switch case если она вам больше нравится.
Код работает, но есть один нюанс. Операционные системы Windows могут быть нескольких типов: серверные (Server) Windows Server 2003, 2008, 2012 и так называемые рабочие станции (Workstation) xp, 7, 8.

Если выполнить наш код в одной из серверных версии ос, например в Windows Server 2012, то в результате получим Windows 8. Как видно на картинке ниже, это происходит, потому что основной и дополнительный номер версии у рабочих станций и сервера совпадает.
ВерсияWorkstationServer
5.1Windows Xp 32x
5.2Windows Xp 64xWindows Server 2003
6.0Windows VistaWindows Server 2008
6.1Windows 7Windows Server 2008 R2
6.2Windows 8Windows Server 2012

Тогда возникает вопрос, как можно определить, что перед нами рабочая станция, а не сервер?
Добавим в наш исходник ещё одну проверку, которая будет находить в реестре ключ ProductType и получать одно из его значений.
Значения ключа
WinNTрабочая станция
LanmanNTконтролер домена
ServerNTСервер
Если Вы не знаете, что такое реестр Windows и как с ним работать, то можете прочитать статью Работа с реестром Windows.
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 тогда получим ключ продукта. Все остальные доступные значения можно найти в реестре, пройдя по указанному пути вручную.
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!