14

我创建了一个自定义安装包来在客户端机器上安装一些字体,并将其部署到C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\FontsInstaller. 一切都很好,将它作为 Visual Studio 2010 中的先决条件进行引用,我能够毫无问题地发布应用程序。

另一方面,客户端在哈希验证期间收到错误:

验证文件哈希

错误:安装程序检测到文件“C:\Users\RMORAN~1\AppData\Local\Temp\VSD4684.tmp\FontsInstaller\fontsinstaller.msi”自最初发布以来已更改或可能已损坏。

我尝试使用 Bootstrapper Manifest Generator 包含哈希并排除它,我总是在客户端上得到相同的结果。一旦哈希验证失败,文件就会立即被删除(出于安全原因)。

现在,我发现一个Microsoft Connect 错误报告说:

“我安装了一个自定义引导程序包作为我的应用程序的先决条件。当我在安装了 Visual Studio 2012 的系统上构建它时,安装失败并出现以下错误:

安装程序检测到文件“...”自最初发布以来已更改或可能已损坏。

我在 Visual Studio 2010 中构建,对包或项目没有任何更改。当未安装 Visual Studio 2012 时,这将按预期工作。”

我尝试在另一个未安装 VS2012 的工作站上构建此安装程序,并且它通过了客户端上的哈希验证(我遇到了签名问题,但那是另一回事)。这确实是具有 VS2012 的构建机器的问题,而不是客户端,因为在我原来的工作站上构建的包在没有 VS2012 的机器上也失败了。

有没有其他人遇到过这个问题,如果是这样,除了没有安装VS2012之外,您是否找到了解决方法?

4

3 回答 3

11

我使用反射工具查看引导程序生成 MSBuild 任务(在安装了 .NET 4.5 的机器上),发现它增加了product.xml文件的<PackageFile />元素。具体来说,它尝试从每个文件中计算一个公钥。如果它可以找到一个,它将键与PublicKey属性的值进行比较。如果值不同,它会发出警告,但在这两种情况下,它都会保留刚刚计算的值。

如果无法确定公钥,则计算文件的 SHA256 哈希值,并与Hash属性值进行类似的比较,如果它们不同,则会发出警告,并Hash使用计算值设置属性值。

SETUPCFG您可以通过从结果中提取资源来确认这些发现setup.exe;它是文件合并的文本版本product.xml

无论如何,还记得我说过如果找不到公钥,它会计算文件的 SHA256 哈希吗?<PackageFiles> 元素(Bootstrapper)的文档说属性的Hash应该是 SHA1 hash

我无法验证结果setup.exe使用哪个 SHA1 或 SHA256 来验证Hash属性的值(它是非托管代码,我找不到它的符号),但让记录显示类似的 .NET 4.0 版本的引导程序生成器 MSBuild 任务显示它确实使用 SHA1 算法来计算Hash属性的值,因此通过推断我们可以说setup.bin(至少来自 Windows SDK v7.0A 的那个)正在使用 SHA1。我很确定我尝试使用setup.binWindows SDK v8.0A 中的,我得到了相同(错误)的结果。(可以通过将setup.binv8.0A SDK 复制到仅支持 .NET 4.0 的机器并查看结果是否setup.exe可以使用基于哈希的验证安装自定义引导程序包来确认这一点)

因此,如果在设置引导程序中基于哈希的验证被破坏,我们至少可以使用公钥(基于证书)验证来代替。好消息是,如果引导程序生成器能够从包文件中提取证书的公钥,它将自动开始使用此机制。坏消息是,这意味着每个包文件都必须使用signtool.exe有效的代码签名证书进行签名(不是每个人都可能有代码签名证书,尽管如果你点击一次,你可能会......)。

一旦我签署了我们的自定义引导程序使用的包文件,当我使用安装了 .NET 4.5 的机器构建项目时,我在运行时停止安装失败,同时在使用没有安装的机器时仍然生成有效的引导程序已安装 .NET 4.5。

tl;dr:使用代码签名证书对包文件进行签名,以避免 .NET 4.5 中引入的缺陷。

于 2013-01-11T04:51:31.183 回答
1

你需要改变GenerateBootstrapper Path

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\Bootstrapper

于 2014-06-05T15:13:07.493 回答
1

您需要从以下位置更改 GenerateBootstrapper Path:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\Bootstrapper

并将 msi 包(您要使用的)从 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper 复制到 C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\引导程序

于 2015-05-14T00:03:50.160 回答