3

我所有的 MSI 安装在验证期间都显示相同的 ICE81“失败”,但我无法弄清楚是什么原因造成的。无论我使用哪个 MSI 编辑器运行验证(MS Orca、Flexera InstallShield、InstEdit.com),都会发生这种情况。我所有的安装包都使用位于正确位置的外部 CAB 文件(与 MSI 文件相同的文件夹),并且所有 CAB 文件都使用与 MSI 文件签名相同的数字签名进行签名(以及媒体中的所有记录、MsiDigitalCertificate、MsiDigitalSignature、和 MsiPatchCertificate 表似乎是正确创作的)。

ICE81 Failure ICE Internal Error 1867. API Returned: 1615.     MSIEditor_full_path\darice.cub
ICE81 Failure Error 2228: C:\Users\my_user_name\AppData\Local\Temp\random_tmp_filename.tmp, feature_name, SELECT `DiskId`, `Cabinet` FROM `Media` WHERE (`DiskId` = cab_name.cab)     MSIEditor\darice.cub

有任何想法吗?

4

2 回答 2

3

该错误ERROR_BAD_QUERY_SYNTAX意味着“SQL 查询语法无效或不受支持”。因此,ICE 用于验证您的 MSI 的内部 SQL 查询失败。查看查询唯一可能失败的部分是查询:WHERE DiskId=cab_name.cab

仔细观察,问题是这cab_name.cab是一个字符串,这意味着它应该用单引号括起来。换句话说,它应该看起来像:'cab_name.cab'. 那么为什么 ICE 没有正确引用字符串呢?嗯,这就是答案。

表格的DiskIdMedia应该是一个数字。不知何故cab_name.cab被插入到表的第一列中,而不是期望Media数字(如)。1ICE 没有在周围加上引号,DiskId因为它需要一个数字,而数字不应该被引用。

要解决此问题,请将表的DiskId(第一)列更改Media为正数(我喜欢1)并将cab_name.cab值放在Cabinet(第四)列中。

我不确定哪些工具允许您将字符串放入整数列中,但您可能会向他们发送错误,因为各种事情都行不通。:)

于 2013-05-02T20:19:51.390 回答
0

多年来,我们的 MSI 软件包一直存在这个问题。我有相同的设置:所有包都使用位于正确位置的外部 CAB 文件,并使用用于签署 MSI 包的相同数字签名进行签名。我们使用 InstallShield 构建软件包(从 IS Developer 2010 开始,一路升级了几次,现在使用 IS Premier 2020)。所有构建一直使用 darice.cub 进行验证(我相信最终来自微软)。

我观察到的是,如果我从 MSI 包(MsiDigitalCertificate、MsiDigitalSignature 和 MsiPatchCertificate)中删除 3 个数字签名表,这种行为就会消失。当然,这些是发布签名包所必需的,因此删除它们确实不是一种选择。我只是指出,如果我删除它们然后运行验证,则不再遇到失败通知(“ICE81 Failure ICE Internal Error 1867. API Returned: 1615.”)。

简而言之,这可能仍然是 darice.cub 的问题,但只有在使用数字签名对包进行签名时才会出现问题。这会让我相信它与 darice.cub ICE81 验证检查生成的 SQL 语句没有任何关系,而是与在包签名时访问表有关。

于 2020-10-23T17:27:52.183 回答