Версия для Windows на C #

Я хочу знать, какая версия Windows установлена ​​на ПК .. в C # Framework 3.5

Я пробовал использовать

Операционная система os = Environment.OSVersion;

Версия ver = os.Version;

Но результат

Платформа: WIN32NT

версия 6.2.9200

Минорная версия: 2

Версия Major: 6

Проблема в том, что у меня Windows 8 Pro ...

Как я могу это обнаружить?

Спасибо


person Diego    schedule 12.02.2014    source источник
comment
Версии операционной системы: msdn. microsoft.com/en-us/library/windows/desktop/   -  person DavidN    schedule 12.02.2014
comment
Ага. Не проблема. Кто-то просто не знает, что внутренняя нумерация окон отличается от маркетингового названия.   -  person TomTom    schedule 12.02.2014


Ответы (4)


Вам нужно будет самостоятельно сопоставить номера версий с соответствующим строковым значением.

Вот список самых последних версий ОС Windows и их соответствующие номера версий:

  • Windows Server 2016 и 2019 - 10.0 *
  • Windows 10 - 10.0 *
  • Windows 8.1 - 6.3 *
  • Windows Server 2012 R2 - 6.3 *
  • Windows 8 - 6.2
  • Windows Server 2012 - 6.2
  • Windows 7 - 6.1
  • Windows Server 2008 R2 - 6.1
  • Windows Server 2008 - 6.0
  • Windows Vista - 6.0
  • Windows Server 2003 R2 - 5.2
  • Windows Server 2003 - 5.2
  • 64-разрядная версия Windows XP - 5.2
  • Windows XP - 5.1
  • Windows 2000 - 5.0

* Для приложений, которые были реализованы для Windows 8.1 или 10. Приложения, не созданные для 8.1 / 10, будут возвращать значение версии ОС Windows 8 (6.2).

Вот источник.

Также из того же источника:

Определение текущей операционной системы обычно не лучший способ определить, присутствует ли конкретная функция операционной системы. Это связано с тем, что операционная система могла иметь новые функции, добавленные в распространяемую DLL. Вместо того, чтобы использовать функции помощника по версии API для определения платформы или номера версии операционной системы, проверьте наличие самой функции.

person Crono    schedule 12.02.2014
comment
+1 за предупреждение о тестировании самой функции. Это заставило меня подумать о другом способе решения моей проблемы, который позволит избежать боли, связанной с номерами версий (я просто собираюсь перехватить ошибку, возникающую, когда функции нет, и обработать ее оттуда). - person Paul; 18.11.2016

В моем сценарии мне нужно, чтобы мое приложение собирало информацию о компьютере для возможных отчетов об ошибках и статистики.

Я не нашел удовлетворительных решений, в которых нужно было бы добавить манифест приложения. К сожалению, большинство предложений, которые я нашел при поиске в Google, предполагали именно это.

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

Другими словами, это становится условием гонки: пользователь моего приложения вполне может использовать версию моего приложения, которая предшествует используемой ОС. Мне пришлось бы обновить приложение немедленно, когда Microsoft выпустила новую версию ОС. Мне также пришлось бы заставить пользователей обновлять приложение одновременно с обновлением ОС.

Другими словами, не очень осуществимо.

После просмотра параметров я нашел несколько ссылок (на удивление мало по сравнению с манифестом приложения), которые вместо этого предлагали использовать поиск в реестре.

Мой (срубленный) класс ComputerInfo только со свойствами WinMajorVersion, WinMinorVersion и IsServer выглядит так:

using Microsoft.Win32;

namespace Inspection
{
    /// <summary>
    /// Static class that adds convenient methods for getting information on the running computers basic hardware and os setup.
    /// </summary>
    public static class ComputerInfo
    {
        /// <summary>
        ///     Returns the Windows major version number for this computer.
        /// </summary>
        public static uint WinMajorVersion
        {
            get
            {
                dynamic major;
                // The 'CurrentMajorVersionNumber' string value in the CurrentVersion key is new for Windows 10, 
                // and will most likely (hopefully) be there for some time before MS decides to change this - again...
                if (TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentMajorVersionNumber", out major))
                {
                    return (uint) major;
                }

                // When the 'CurrentMajorVersionNumber' value is not present we fallback to reading the previous key used for this: 'CurrentVersion'
                dynamic version;
                if (!TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentVersion", out version))
                    return 0;

                var versionParts = ((string) version).Split('.');
                if (versionParts.Length != 2) return 0;
                uint majorAsUInt;
                return uint.TryParse(versionParts[0], out majorAsUInt) ? majorAsUInt : 0;
            }
        }

        /// <summary>
        ///     Returns the Windows minor version number for this computer.
        /// </summary>
        public static uint WinMinorVersion
        {
            get
            {
                dynamic minor;
                // The 'CurrentMinorVersionNumber' string value in the CurrentVersion key is new for Windows 10, 
                // and will most likely (hopefully) be there for some time before MS decides to change this - again...
                if (TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentMinorVersionNumber",
                    out minor))
                {
                    return (uint) minor;
                }

                // When the 'CurrentMinorVersionNumber' value is not present we fallback to reading the previous key used for this: 'CurrentVersion'
                dynamic version;
                if (!TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentVersion", out version))
                    return 0;

                var versionParts = ((string) version).Split('.');
                if (versionParts.Length != 2) return 0;
                uint minorAsUInt;
                return uint.TryParse(versionParts[1], out minorAsUInt) ? minorAsUInt : 0;
            }
        }

        /// <summary>
        ///     Returns whether or not the current computer is a server or not.
        /// </summary>
        public static uint IsServer
        {
            get
            {
                dynamic installationType;
                if (TryGeRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "InstallationType",
                    out installationType))
                {
                    return (uint) (installationType.Equals("Client") ? 0 : 1);
                }

                return 0;
            }
        }

        private static bool TryGeRegistryKey(string path, string key, out dynamic value)
        {
            value = null;
            try
            {
                var rk = Registry.LocalMachine.OpenSubKey(path);
                if (rk == null) return false;
                value = rk.GetValue(key);
                return value != null;
            }
            catch
            {
                return false;
            }
        }
    }
}
person Spiralis    schedule 09.06.2016

Я выпустил OsInfo nuget, чтобы легко сравнивать версии Windows.

bool win8OrLess = Environment.OSVersion.IsLessThanOrEqualTo(OsVersion.Win8);
bool winXp = Environment.OSVersion.IsEqualTo(OsVersion.WinXP);
int? servicePack = Environment.OSVersion.GetServicePackVersion();
bool is64bit = Environment.OSVersion.Is64Bit(); // Already covered in .NET 4.5+
person angularsen    schedule 22.01.2015
comment
есть ли у вас планы добавить поддержку Windows 10? - person mecsco; 19.10.2015
comment
Пожалуйста, создайте проблему на github и обсудите ее там. Я уверен, что это легко добавить. Если вы отправите запрос на перенос, я по крайней мере объединю его и выпущу новый nuget. - person angularsen; 19.10.2015
comment
Спасибо за ответ - возникла проблема - github.com/anjdreas/OsInfo/issues/1 - person mecsco; 19.10.2015

Попробуй это:

using System.Management;

private string fnGetFriendlyName()
{
    var name = (from x in new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem").Get().OfType<ManagementObject>()
                select x.GetPropertyValue("Caption")).FirstOrDefault();
    return name != null ? name.ToString() : "Unknown";
}

Источник: https://stackoverflow.com/a/2016557/3273962

person Mangesh    schedule 23.03.2016