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

fek*_*lee 6 installation legacy windows-server-2012

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

不支持的操作系统,major=6,version=2.2,sp=0.0,type=3

是否有可能使用垫片来改变type=3type=1对安装?如果是这样,关键步骤是什么?

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

Rya*_*ies 5

我的第一个答案错了​​。我对您的第一个建议是为您的应用程序制作一个“版本谎言”垫片。但是您不能,因为您使用的是托管代码应用程序。我并不是说你不能为 .NET 应用程序编写 API 钩子,但 appcompat shim 支持似乎对托管应用程序有很多问题。

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

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

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

大多数情况下,您可以使用 Application Compatibility Toolkit 制作自己的垫片:

http://blogs.technet.com/b/askperf/archive/2011/06/17/demystifying-shims-or-using-the-app-compat-toolkit-to-make-your-old-stuff-work-与你的新东西.aspx

AppCompat 工具包

并且做一个“版本谎言”,其中垫片对应用程序来说是关于它正在运行的版本是 appcompat 垫片的最常见用例。

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

但是开发人员仍然每天都会进行版本检查。更糟糕的是,他们会进行“==”版本检查,除非您运行的是 Windows的确切版本,否则该应用程序根本无法运行,这是任意且愚蠢的。

叹息……开发者。

Microsoft 的 Chris Jackson 在应用程序兼容性方面工作多年,他的态度是相似的:

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

但不幸的是,在同一篇文章中,他给了我们我认为的关键信息:

好的,现在您已经启动了 CompatAdmin,在 System Database 下,展开 Compatibility Fixes 列表。使用 /x 开关,您会注意到 WinXPSP2VersionLie 现在有一个加号 - 如果展开它,您将看到旁边有一个红色菱形的模块列表。这些是此 shim 特别排除的模块。在这些当中?.NET 框架模块。

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

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

对于需要版本谎言的实际应用程序,如果应用程序被管理,您将不得不更改代码。这是你不能也不应该做的事情。

因此,如果您发现版本谎言不起作用,并且应用程序受到管理,那么我的诡异感觉告诉我,您正试图用 XP 版本谎言来修补它——这是行不通的。

MSDN

通常,应用程序不应执行操作系统版本检查。如果应用程序需要特定功能,最好尝试找到该功能,只有在缺少所需功能时才会失败。