【问题标题】:How to detect OS of Win7 Home Premium, Win7 Professional, Win7 Enterprise or Win7 ultimate?如何检测 Win7 Home Premium、Win7 Professional、Win7 Enterprise 或 Win7 Ultimate 的操作系统?
【发布时间】:2009-11-19 07:10:16
【问题描述】:

如何检测Win7 Home Premium、Win7 Professional、Win7 Enterprise或Win7 Ultimate的操作系统?

【问题讨论】:

    标签: api winapi windows-7 operating-system


    【解决方案1】:

    Determine Windows Version and Edition

    查看此帖子Detect OS version 看看是否有帮助。这适用于 XP,但它应该对您有所帮助。

    也检查一下http://andrewensley.com/2009/06/c-detect-windows-os-part-1/this one is for Vista

    【讨论】:

    • 感谢您提供指向我博客的链接。我希望它会有所帮助。 +1
    【解决方案2】:

    我使用HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion下的“Edition”键来确定windows版本,不知道是不是唯一的?谢谢。

    EditionID = 终极版 版本 ID = 企业 EditionID = 专业 EditionID = 高级版

    【讨论】:

      【解决方案3】:

      他用win32 api标记了这个问题。

      GetVersionEx() 等。是你需要的。有关更深入的示例,请参阅此 code sample

      【讨论】:

        【解决方案4】:

        在 Delphi 中,我会在 Windows XP 及以上版本中使用此方法,这似乎是最直接的方法,并且此注册表项应该始终存在

        var 
          Reg : TRegistry
        begin
          Reg := TRegistry.Create();
          Reg.RootKey := HKEY_LOCAL_MACHINE;
          Reg.OpenKey('Software\Microsoft\Windows NT\CurrentVersion', false);
          Caption := Reg.ReadString('ProductName');
          Reg.Free;
        end
        

        您需要将注册表作为一个单元包含在您的应用中

        【讨论】:

          【解决方案5】:

          尝试 WMI:主机 localhost,命名空间 root\cimv2(这些是默认值)SELECT Caption FROM Win32_OperatingSystem

          【讨论】:

            【解决方案6】:

            我打算建议看看它装运的盒子;)

            【讨论】:

            • "亲爱的用户,请找到您的操作系统的包装盒并输入其名称"> *头部被刮擦的声音*“Windows”
            【解决方案7】:

            在我看来,使用检查版本号之类的方法是不正确的。我正在阅读一篇关于最佳实践的文章(丢失了链接),它明确表示永远不要使用这些版本号,微软可能会在未来的更新中更改这些版本号来检测 Windows 版本。

            Windows Vista 是 6.0 版,Windows 7 是 6.1,理想情况下应该是 7。这根本不可靠。

            更好的方法是检查每个版本的 windows 特有的功能的存在。例如,在 windows vista/7 home basic 中您找不到航空体验。同样的方式终极版带有bitlocker等,而家庭高级版则没有。

            MSDN 将详细说明每个版本中可用的功能以及如何查询是否可用。基于此,您可以决定什么是 Windows 的基本版本。您还可以使用从系统 dll 中查询版本信息来检测确切的 Windows 构建日期等。

            与 vista 相比,在 windows 7 系统中添加了新的 DLL。因此,当您搜索特定的 dll 时,您会知道它是 windows 7 系统还是 xp/vista 等旧版本。

            【讨论】:

            • Windows 会增加版本号,但绝不会减少它。出于应用程序兼容性的原因,Windows 7 被标记为 6.1 版;有很多第 3 方代码无法很好地检查版本号。
            • @埃里克·布朗。请参阅 Microsoft Windows 7 和 Windows Server 2008 R2 Application Quality Cookbook 中的此文档,地址为 code.msdn.microsoft.com/Windows7AppQuality/Release/…。检查操作版本控制部分,在解决方案部分它说“通常,应用程序不应该执行操作系统版本检查。如果应用程序需要特定功能,最好尝试找到该功能,并且只有在缺少所需功能时才会失败"。
            • @Eric Brown:检查 Bob Moore 在此处发布的答案之一中提供的链接 (windowsteamblog.com/blogs/developers/archive/2009/08/05/…)。 “如前所述,检查操作系统版本并不是确认特定操作系统功能可用的最佳方式。这是因为操作系统可能在可再发行的 DLL 中添加了新功能。而不是使用 GetVersionEx 来确定操作系统平台或版本号,测试功能本身是否存在更有效。”
            【解决方案8】:

            您可以使用 GetVersionEx 来确定核心操作系统版本,但这种方法在面对使用共同核心的多个产品时会变得混乱,而且我认为您不能以编程方式将此信息解码到特定 SKU 的级别。最好的办法是找到一个字符串并让用户看到。文档here的备注部分显示了一些简单的OSVERSIONINFOEX 映射

            阅读this Microsoft blog posting 了解有关此主题的当前想法。基本上它归结为使用 GetProcAddress 来查找您尝试使用的 API 并优雅地降级。

            【讨论】:

              【解决方案9】:

              我来这里是为了寻找同样的东西,但对于 powershell 并发现这是最简单的:

              (gwmi -class Win32_OperatingSystem).name
              

              返回如下一行:

              Microsoft Windows 7 Enterprise |C:\Windows|\Device\Harddisk0\Partition2
              

              如果您想要版本号等,请使用详细的形式,例如

              gwmi -class Win32_OperatingSystem | FL *
              

              挑选你需要的东西

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-12-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多