Как получить «дружественное» название версии ОС? - PullRequest
54 голосов
/ 23 февраля 2009

Я ищу элегантный способ получить версию ОС, такую ​​как: «Windows XP Professional Service Pack 1» или «Windows Server 2008 Standard Edition» и т. Д.

Есть ли элегантный способ сделать это?

Меня также интересует архитектура процессора (например, x86 или x64).

Ответы [ 11 ]

65 голосов
/ 07 января 2010

Вы можете использовать WMI для получения названия продукта («Microsoft® Windows Server® 2008 Enterprise»):

using System.Management;
var name = (from x in new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem").Get().Cast<ManagementObject>()
                      select x.GetPropertyValue("Caption")).FirstOrDefault();
return name != null ? name.ToString() : "Unknown";
27 голосов
/ 28 ноября 2013

Вы действительно должны избегать WMI для локального использования. Это очень удобно, но вы платите дорого за это с точки зрения производительности. Это быстро и просто:

    public string HKLM_GetString(string path, string key)
    {
        try
        {
            RegistryKey rk = Registry.LocalMachine.OpenSubKey(path);
            if (rk == null) return "";
            return (string)rk.GetValue(key);
        }
        catch { return ""; }
    }

    public string FriendlyName()
    {
        string ProductName = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName");
        string CSDVersion = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CSDVersion");
        if (ProductName != "")
        {
            return (ProductName.StartsWith("Microsoft") ? "" : "Microsoft ") + ProductName +
                        (CSDVersion != "" ? " " + CSDVersion : "");
        }
        return "";
    }
21 голосов
/ 23 февраля 2009

Почему бы не использовать Environment.OSVersion? Он также скажет вам, что это за операционная система - Windows, Mac OS X, Unix и т. Д. Чтобы узнать, работаете ли вы в 64-битной или 32-битной среде, используйте IntPtr.Size - это вернет 4 байта для 32-битной и 8 байтов для 64 бит.

10 голосов
/ 06 октября 2016

Попробуйте:

new ComputerInfo().OSVersion;

Выход:

Microsoft Windows 10 Enterprise

Примечание: Добавить ссылку на Microsoft.VisualBasic.Devices;

7 голосов
/ 07 января 2012

Пример вывода:

Name = Windows Vista
Edition = Home Premium
Service Pack = Service Pack 1
Version = 6.0.6001.65536
Bits = 64

Образец класса:

class Program
{
    static void Main( string[] args )
    {
        Console.WriteLine( "Operation System Information" );
        Console.WriteLine( "----------------------------" );
        Console.WriteLine( "Name = {0}", OSInfo.Name );
        Console.WriteLine( "Edition = {0}", OSInfo.Edition );
        Console.WriteLine( "Service Pack = {0}", OSInfo.ServicePack );
        Console.WriteLine( "Version = {0}", OSInfo.VersionString );
        Console.WriteLine( "Bits = {0}", OSInfo.Bits );
        Console.ReadLine();
    }
}

Исходный код для класса OSInfo: http://www.csharp411.com/determine-windows-version-and-edition-with-c/ Однако в коде есть ошибка, вам нужно заменить оператор case 6 (он находится перед #endregion NAME) следующим:

case 6:
    switch (minorVersion)
    {
        case 0:

            switch (productType)
            {
                case 1:
                    name = "Windows Vista";
                    break;
                case 3:
                    name = "Windows Server 2008";
                    break;
            }
            break;
        case 1:
            switch (productType)
            {
                case 1:
                    name = "Windows 7";
                    break;
                case 3:
                    name = "Windows Server 2008 R2";
                    break;
            }
            break;
    }
    break;

И если вы хотите пойти дальше и посмотреть, работает ли ваша программа в 64- или 32-битном режиме:

public static class Wow
{
    public static bool Is64BitProcess
    {
        get { return IntPtr.Size == 8; }
    }

    public static bool Is64BitOperatingSystem
    {
        get
        {
            // Clearly if this is a 64-bit process we must be on a 64-bit OS.
            if (Is64BitProcess)
                return true;
            // Ok, so we are a 32-bit process, but is the OS 64-bit?
            // If we are running under Wow64 than the OS is 64-bit.
            bool isWow64;
            return ModuleContainsFunction("kernel32.dll", "IsWow64Process") && IsWow64Process(GetCurrentProcess(), out isWow64) && isWow64;
        }
    }

    static bool ModuleContainsFunction(string moduleName, string methodName)
    {
        IntPtr hModule = GetModuleHandle(moduleName);
        if (hModule != IntPtr.Zero)
            return GetProcAddress(hModule, methodName) != IntPtr.Zero;
        return false;
    }

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    extern static bool IsWow64Process(IntPtr hProcess, [MarshalAs(UnmanagedType.Bool)] out bool isWow64);
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    extern static IntPtr GetCurrentProcess();
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    extern static IntPtr GetModuleHandle(string moduleName);
    [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
    extern static IntPtr GetProcAddress(IntPtr hModule, string methodName);
}
3 голосов
/ 23 февраля 2009

Следует соблюдать осторожность, так как эта информация обычно локализована и будет отображаться по-разному в зависимости от языка ОС.

Вы можете получить много информации от WMI . Ищите Win32_OperatingSystem class

2 голосов
/ 23 февраля 2009

Обратите внимание, что вопрос архитектуры процессора является сложным:

Вы имеете в виду (старшие числа требуют меньших чисел, чтобы быть правдой):

  1. Процессор способен обрабатывать 64 бита (в том смысле, что он поддерживает AMD / Intel x64 или Itanium)
  2. Операционная система является 64-битной
    • GPR и указатели - 64-битные, то есть XP 64, Vista 64, 64-битная версия сервера или 64-битная ОС для моно
  3. Текущий процесс - это 64-битный процесс (например, не выполняется под Wow64)

если вы счастливы, что все 3 должны быть верными, тогда

IntPtr.Size == 8

Указывает, что все три верны

1 голос
/ 12 июля 2017

Вы можете использовать устройства Visual Basic для получения информации о версии.

Код:

using Microsoft.VisualBasic.Devices;

var versionID = new ComputerInfo().OSVersion;//6.1.7601.65536
var versionName = new ComputerInfo().OSFullName;//Microsoft Windows 7 Ultimate
var verionPlatform = new ComputerInfo().OSPlatform;//WinNT

Console.WriteLine(versionID);
Console.WriteLine(versionName);
Console.WriteLine(verionPlatform);

Выход:

6.1.7601.65536

Microsoft Windows 10 Enterprise

WinNT

Примечание: Вам нужно будет добавить ссылку на Microsoft.VisualBasic;

1 голос
/ 15 апреля 2016

Немного поздно, но я так и сделал. Может помочь кому-то в будущем.

using Microsoft.Win32;

RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows NT\\CurrentVersion");
        string pathName = (string)registryKey.GetValue("productName");
1 голос
/ 27 декабря 2014

Я знаю, что это не прямой ответ на вопрос, и это также немного поздно, но для тех, кто ищет только способ определить, является ли ОС клиентской ОС или сервером, есть способ использовать следующее: (необходимо включить ссылку на System.Management)

        using System;
        using System.Management;

        ManagementClass osClass = new ManagementClass("Win32_OperatingSystem");
        foreach (ManagementObject queryObj in osClass.GetInstances())
        {

            foreach (PropertyData prop in queryObj.Properties)
            {

                if (prop.Name == "ProductType")
                {

                    ProdType = int.Parse(prop.Value.ToString());
                }
            }
        }

в то время как переменная ProdType является целым числом, которое было инициализировано ранее. Он будет содержать значение от 1 до 3, в то время как 1 означает «Рабочая станция», 2 - «Контроллер домена» и 3 - «Сервер».

Это взято из Доступ к свойствам Win32_OperatingSystem и немного изменен ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...