可以使用垫片来更改 Windows 版本号吗?

可以使用垫片来更改 Windows 版本号吗?

我有一个安装程序抱怨错误的 Windows 版本号,阻止升级到要在 Windows Server 2012 上安装的应用程序:

不受支持的操作系统,主要=6,版本=2.2,sp=0.0,类型=3

是否可以使用垫片安装程序要改成type=3什么type=1?如果是,关键步骤是什么?

根据.exe文件的属性,安装程序由点NetInstaller。我可以想象它通过调用 API 函数来检索版本号GetProductInfo (更新:不,这是GetVersionEx)。我已经尝试在各种兼容模式下运行安装程序。不幸的是,这并不影响报告的版本号。另请参阅我的问题关于超级用户。

答案1

我的第一个答案是错误的。我给你的第一个建议是为你的应用程序制作一个“版本谎言”垫片。但你不能,因为你使用的是托管代码应用程序。我并不是说你不能为 .NET 应用程序编写 API 挂钩,但 appcompat 垫片对托管应用程序的支持似乎要差得多。

应用程序垫片实现 API 重定向,以便当应用程序进行某个 API 调用时,它会被拦截或“劫持”,并且一些其他数据会从垫片返回给应用程序。

http://technet.microsoft.com/en-us/library/dd837644(v=WS.10).aspx

垫片基础结构实现了一种应用程序编程接口 (API) 挂钩。具体来说,它利用链接的特性将 API 调用从 Windows 本身重定向到替代代码(垫片本身)。

大多数情况下,你可以使用应用程序兼容性工具包来编写自己的垫片:

http://blogs.technet.com/b/askperf/archive/2011/06/17/demystifying-shims-or-using-the-app-compat-toolkit-to-make-your-old-stuff-work-with-your-new-stuff.aspx

AppCompat 工具包

并且进行“版本谎言”,即垫片向应用程序撒谎有关其正在运行的版本,这是 appcompat 垫片最常见的用例。

因为开发商坚持在代码中进行版本检查,这是错误的。微软告诉你这是错误的。不要在代码中进行版本检查。(相反,检查你打算使用的特定功能是否存在。)

但开发人员仍然每天进行版本检查。更糟糕的是,他们进行“==”版本检查,除非您运行精确的版本的 Windows,这是任意和愚蠢的。

唉……开发人员。

微软的 Chris Jackson 多年来一直致力于应用程序兼容性工作,他的态度也类似:

人们认为最容易理解的一类垫片是版本谎言垫片。本质上,我们拥有可以弥补许多开发人员的键盘附带有缺陷的 > 键这一事实的垫片(开发人员键盘上此键的故障率令人吃惊)。它们的工作原理只是从 GetVersion(Ex) API 返回不同的值,具体取决于您选择的操作系统。

但不幸的是在同一篇文章中他向我们提供了我认为至关重要的信息:

好的,现在您已经启动了 CompatAdmin,在系统数据库下,展开兼容性修复列表。使用 /x 开关,您会注意到 WinXPSP2VersionLie 现在有一个加号 - 如果您展开它,您将看到一个模块列表,旁边有一个红色菱形。这些是此填充程序专门排除的模块。其中包括 .NET Framework 模块。

你看,.NET Framework 并不太喜欢被欺骗。他们会进行版本检查来确定如何实现某些事情,而认为它们在低级别运行并不是一件好事。因此,我们有意排除这些模块,因此,我们有意排除您正在编写的这些模块正在 JIT 和执行的代码。并不是我们想这样做,但基础架构没有给我们一个很好的方法来分离它们。我们要么对一切都撒谎,要么什么都不撒谎。对一切都撒谎更糟糕,所以我们没有这样做。

呵呵,当我刚刚说这是一个多么糟糕的想法时,.NET 也在进行版本检查,这真是太有趣了……

对于需要版本号的现实应用程序,如果应用程序是托管的,则必须更改代码。这是您无法也不应该弥补的事情。

因此,如果您发现版本谎言不起作用,并且应用程序受到管理,那么我的直觉告诉我您正在尝试用 XP 版本谎言来掩盖它 - 而这是行不通的。

微软

一般来说,应用不应该执行操作系统版本检查。如果应用需要特定功能,最好尝试查找该功能,并且只有在缺少所需功能时才会失败。

相关内容