MSVC OSVersion返回错误的版本

时间:2017-11-10 15:32:04

标签: c++ visual-studio powershell visual-c++ windows-10

在我的开发计算机上运行Windows 10。试图让操作系统版本返回10. Tried this的主要版本,并通过System::Environment::OSVersion->VersionString尝试环境变量。两者都返回Microsoft Windows NT 6.2.9200。在Windows 7计算机上测试可执行文件,我得到6.1.*(正确)。

在Powershell中运行我得到了正确的结果:

PS Z:\> [System.Environment]::OSVersion.Version

Major  Minor  Build  Revision
-----  -----  -----  --------
10     0      14393  0

我使用相同的环境变量逻辑在Visual Studio中编写了一个测试C ++程序...

#include <Windows.h>
#include <iostream>

using namespace std; 

int main(int argc, char **argv, char** envp) {
    printf("Current compiler version is ... %d\n", _MSC_VER);
    printf("Current compiler full version is ... %d\n", _MSC_FULL_VER);
    printf("Current OSVersion is ... %s\n\n", System::Environment::OSVersion->VersionString);

    char** env;
    for (env = envp; *env != 0; env++)
    {
        char* thisEnv = *env;
        printf("%s\n", thisEnv);
    }

    cin.ignore();
    cin.ignore();

    return 0;
}

结果(我不会打印除一个以外的所有环境变量)......

Current compiler version is ... 1900
Current compiler full version is ... 190024215
Current OSVersion is ... Microsoft Windows NT 6.2.9200.0

...
OS=Windows_NT

上述测试程序配置为目标平台为10.0.14393.0

为什么我认为我的操作系统是Windows 8?

规格:

  • Windows 10
  • 版本10.0.14393 Build 14393
  • Visual Studio 2015(C ++项目)
    • 目标平台10.0.14393.0
  • Powershell版本5.1

1 个答案:

答案 0 :(得分:1)

这是设计使得GetVersionExVerifyVersionInfo函数在Windows 8.1或更高版本上为所有Win32桌面应用程序默认启用了“版本谎言”。

您可以通过向EXE添加包含正确兼容性GUID的嵌入式清单来控制“版本谎言”的应用程序:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
       <application> 
           <!-- Windows Vista -->
           <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
           <!-- Windows 7 -->
           <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
           <!-- Windows 8 -->
           <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
           <!-- Windows 8.1 -->
           <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
           <!-- Windows 10 -->
           <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
       </application> 
   </compatibility>
</assembly>

请参阅MSDNManifest Madness