Windows installer MSI验证返回”;ICE81故障ICE内部错误1867。退回的空气污染指数:1615。”;

Windows installer MSI验证返回”;ICE81故障ICE内部错误1867。退回的空气污染指数:1615。”;,windows-installer,installshield-2012,orca,Windows Installer,Installshield 2012,Orca,我的所有MSI安装在验证期间都显示相同的ICE81“失败”,但我无法找出原因。无论我使用哪个MSI编辑器运行验证(MS Orca、Flexera InstallShield、InstEdit.com),都会发生这种情况。我的所有安装包都使用位于正确位置的外部CAB文件(与MSI文件相同的文件夹),并且所有CAB文件都使用MSI文件所用的相同数字签名进行签名(并且媒体中的所有记录、MSIDgitalCertificate、MSIDgitalSignature和MsiPatchCertificate

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


有什么想法吗?

错误是
error\u BAD\u QUERY\u SYNTAX
,意思是“SQL查询语法无效或不受支持”。因此,ICE为验证MSI而进行的内部SQL查询失败。查看查询,唯一可能失败的部分是查询:
WHERE DiskId=cab\u name.cab

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

Media
表的
DiskId
列应该是一个数字。不知何故,
cab\u name.cab
被插入到
Media
表的第一列中,在那里需要一个数字(如
1
)。ICE不会在
磁盘ID
周围加引号,因为它需要一个数字,而数字不应该加引号

要修复此问题,请将
Media
表的
DiskId
(第一)列更改为正数(我喜欢
1
),并将
cab\u name.cab
值放入
Cabinet
(第四)列


我不确定是什么工具允许您将字符串放入整数列中,但您可能会向它们发送一个错误,因为各种事情都不起作用。:)

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

我观察到,如果我从MSI包中删除3个数字签名表(MSIDgitalCertificate、MSIDgitalSignature和MsiPatchCertificate),这种行为就会消失。当然,这些都是发布签名包所必需的,因此删除它们确实不是一个选项。我只是指出,如果我删除了它们,然后运行验证,那么就不会再遇到失败通知(“ICE81故障ICE内部错误1867.API返回:1615”)

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

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