可以用Shims来改变Windows版本号吗?

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

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

是否可以使用填充将安装程序的type=3更改为type=1 如果是这样,关键的步骤是什么?

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

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

应用程序可以实现APIredirect,这样当应用程序进行特定的API调用时,它将被拦截或“劫持”,其他一些数据将从Shim中返回给应用程序。

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

Shim基础设施实现了一种应用程序编程接口(API)挂钩forms。 具体来说,它利用链接的性质将来自Windows本身的API调用redirect到替代代码 – 垫片本身。

大多数情况下,您可以使用应用程序兼容性工具包制作自己的垫片:

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

AppCompat工具包

做一个“版本谎言”,其中的垫片躺在应用程序上它运行的是什么版本是最常见的用例appcompat垫片。

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

但开发人员仍然每天都进行版本检查。 更糟糕的是,他们做'=='版本检查应用程序根本无法工作,除非你运行一个确切的Windows版本,这是任意的和愚蠢的。

叹息…开发者。

微软的克里斯·jackson(Chris Jackson)多年来一直致力于应用程序兼容性方面的工作,他的态度很相似:

人们发现最容易理解的垫片类之一是版本的垫片。 从本质上说,我们可以弥补这样的事实,即如此多的开发人员键盘出现“有缺陷”键(并且开发人员键盘上此键的故障率是令人惊讶的)。 它们只是从GetVersion(Ex)API返回一个不同的值,具体取决于你select的操作系统。

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

好了,现在您已经启动了CompatAdmin,在“系统数据库”下展开“兼容性修补程序”列表。 使用/ x开关,你会注意到WinXPSP2VersionLie现在有一个加号 – 如果你展开这个,你会看到一个模块列表,旁边有一个红色的钻石。 这是这个垫片明确排除的模块。 在这些当中? .NET框架模块。

你看,.NET框架并不太乐意被欺骗。 他们进行版本检查,以确定如何实现某些事情,并认为他们正在低级别运行并不是那么好。 所以,我们故意排除这些模块,因此,我们故意排除你写这些模块正在执行的代码。 不是我们想这样做,但基础设施并没有给我们一个很好的方法来分离出来。 我们要么欺骗一切,要么我们一无所有。 对一切说谎都更糟,所以我们没有。

呵呵,当我刚才说一个想法有多糟糕的时候,.NET也在做版本检查,这有点儿有趣。

对于需要版本谎言的实际应用程序来说,如果应用程序被pipe理,那么就必须更改代码。 这是你不能,也不应该的。

所以,如果你注意到版本谎言不工作,并且应用程序被pipe理,那么我的spidey感觉告诉我你正在试图用XP版本的谎言来弥补 – 这是行不通的。

来自MSDN :

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