Как программная версия ОС Windows

Я пытаюсь получить версию Windows с С# на моей машине с Windows 10.

Я всегда получаю эти значения (с С#\С++):

Майор: 6

Незначительный: 2

Что такое ОС Windows 8, в соответствии с MSDN

Код С#:

var major = OperatingSystem.Version.Major
var minor  = OperatingSystem.Version.Minor

Код С++

void print_os_info()
{
    //http://stackoverflow.com/info/1963992/check-windows-version
    OSVERSIONINFOW info;
    ZeroMemory(&info, sizeof(OSVERSIONINFOW));
    info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);

    LPOSVERSIONINFOW lp_info = &info;
    GetVersionEx(lp_info);

    printf("Windows version: %u.%u\n", info.dwMajorVersion, info.dwMinorVersion);
}

Windows 10 предположим, что с ними:

Майор: 10

Незначительный: 0 *

  • (Когда я беру файл дампа из запущенного процесса, я вижу, что версия ОС этого файла установлена ​​в 10.0)

построено: 10.0.10586.0 (th2_release.151029-1700)

Что мне здесь не хватает?

Ответ 1

Поскольку принятый ответ относится только к С#, вот решение для С++.

Он использует RtlGetVersion в файле ntdll.dll, который использует ту же структуру, что и GetVersionEx (имя отличается, но элементы одинаковы) и дает вам правильную версию. Поскольку эта функция обычно используется для разработки драйверов, функция объявляется в DDK, а не в SDK. Поэтому я использовал динамическое решение для вызова функции. Помните, что ntdll.dll загружается и освобождается при каждом вызове. Поэтому, если вам нужна функция чаще, храните библиотеку загруженной.

Структурная pOSversion, указывающая на то, должна быть инициализирована, как и для GetVersionEx.

BOOL GetTrueWindowsVersion(OSVERSIONINFOEX* pOSversion)
{
   // Function pointer to driver function
   NTSTATUS (WINAPI *pRtlGetVersion)(
      PRTL_OSVERSIONINFOW lpVersionInformation) = NULL;

   // load the System-DLL
   HINSTANCE hNTdllDll = LoadLibrary("ntdll.dll");

   // successfully loaded?
   if (hNTdllDll != NULL)
   {
      // get the function pointer to RtlGetVersion
      pRtlGetVersion = (NTSTATUS (WINAPI *)(PRTL_OSVERSIONINFOW))
            GetProcAddress (hNTdllDll, "RtlGetVersion");

      // if successfull then read the function
      if (pRtlGetVersion != NULL)
         pRtlGetVersion((PRTL_OSVERSIONINFOW)pOSversion);

      // free the library
      FreeLibrary(hNTdllDll);
   } // if (hNTdllDll != NULL)

   // if function failed, use fallback to old version
   if (pRtlGetVersion == NULL)
      GetVersionEx((OSVERSIONINFO*)pOSversion);

   // always true ...
   return (TRUE);
} // GetTrueWindowsVersion

Ответ 2

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

Я не нашел решений, в которых должен был быть добавлен манифест приложения. Большинство предложений, которые я нашел во время поиска в 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 (TryGetRegistryKey(@"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 (!TryGetRegistryKey(@"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 (TryGetRegistryKey(@"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 (!TryGetRegistryKey(@"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 (TryGetRegistryKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "InstallationType",
                    out installationType))
                {
                    return (uint) (installationType.Equals("Client") ? 0 : 1);
                }

                return 0;
            }
        }

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

Ответ 3

Вам нужно добавить app.manifest в ваше приложение:

введите описание изображения здесь

введите описание изображения здесь

затем раскомментируйте следующую строку:

<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />

Ответ 4

Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentBuildNumber", string.Empty).ToString()

тот же код для всех ОС от XP до текущего 10.16299, над сценариями неправильно работают из окон 8

Свойство OSVersion сообщает тот же номер версии (6.2.0.0) для Windows 8 и Windows 8.1 и тот же самый основной и младший номер версии для Windows 10.

https://msdn.microsoft.com/library/system.environment.osversion.aspx

Ответ 5

Вы можете читать из regsirty через код и выполнять конкретные действия, что вы намеревались.

Скажем, например:

Ключ реестра вы можете найти здесь:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion, а затем найдите "ProductName"

Вы можете открыть информацию реестра, предоставив regedit.exe в run (windows + r)

var reg              =Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\WindowsNT\CurrentVersion");

        string productName = (string)reg.GetValue("ProductName");

        if (productName.StartsWith("Windows 10"))
        {
        }
        else
        {
        }