Это довольно старый вопрос, но мне недавно пришлось решить эту проблему, и я нигде не опубликовал свое решение.
Самый простой (и самый простой способ, на мой взгляд), это просто использовать вызов pinvoke для RtlGetVersion
[DllImport("ntdll.dll", SetLastError = true)]
internal static extern uint RtlGetVersion(out Structures.OsVersionInfo versionInformation); // return type should be the NtStatus enum
[StructLayout(LayoutKind.Sequential)]
internal struct OsVersionInfo
{
private readonly uint OsVersionInfoSize;
internal readonly uint MajorVersion;
internal readonly uint MinorVersion;
private readonly uint BuildNumber;
private readonly uint PlatformId;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
private readonly string CSDVersion;
}
Где номера версий Major и Minor в этой структуре соответствуют значениям в таблице принятого ответа.
Возвращает правильный номер версии Windows в отличие от устаревших функций GetVersion & GetVersionEx из kernel32