问题描述:

项目中使用Wix burn打包,内部包含了多个MSI。有时候会遇到如下错误

Error 0x80091007: Failed to verify hash of payload: SetupProject1.msi 。

问题解析:

首先需要了解Wix Brun校验其payload的原理,主要有如下两种情况:

1)如果MSI有数字签名,则根据MSI的数字签名进行校验,也就是说如果数字签名没有变,Burn不会校验MSI的内容是否变化

2)如果MSI无数字签名,则获取该MSI的SHA1 hash,在安装的时候校验hash。这种情况下,如果MSI的内容发生变化,则无法使用该burn进行安装,必须重新编译。

WIX Brun 源代码 (burn\engine\cache.cpp)

static HRESULT VerifyThenTransferPayload(
__in BURN_PAYLOAD* pPayload,
__in_z LPCWSTR wzCachedPath,
__in_z LPCWSTR wzUnverifiedPayloadPath,
__in BOOL fMove
)
{
。。。
// If the payload has a certificate root public key identifier provided, verify the certificate.
if (pPayload->pbCertificateRootPublicKeyIdentifier)
{
hr = CacheVerifyPayloadSignature(pPayload, wzUnverifiedPayloadPath, hFile);
ExitOnFailure1(hr, "Failed to verify payload signature: %ls", wzCachedPath);
}
else if (pPayload->pCatalog) // If catalog files are specified, attempt to verify the file with a catalog file
{
hr = VerifyPayloadWithCatalog(pPayload, wzUnverifiedPayloadPath, hFile);
ExitOnFailure1(hr, "Failed to verify payload signature: %ls", wzCachedPath);
}
else if (pPayload->pbHash) // the payload should have a hash we can use to verify it.
{
hr = VerifyHash(pPayload->pbHash, pPayload->cbHash, wzUnverifiedPayloadPath, hFile);
ExitOnFailure1(hr, "Failed to verify payload hash: %ls", wzCachedPath);
}
。。。
}

解决方法:

了解了问题的原理,方法就显而易见了。

[每天解决一问题系列 - 0005] WiX Burn 如何校验chained package的合法性的更多相关文章

  1. Wix Burn运行64位dism.exe的问题

    主要的问题是Burn是一个32位程序,在64位机器上它启动的进程都会被重定向到wow64目录下,也就是说它运行的dism.exe最终会是32位的.解决的方法就是用wix提供的QtExec64CmdLi ...

  2. 解决Adobe cs6系列软件在Windows10操作系统中无法正常运行问题

    大家好,我是安德风,很高兴今天能给大家一起解决Adobe cs6系列软件在Windows10操作系统中无法正常运行的问题.今天我以Adobe Photoshop cs6在Windows10环境安装运行 ...

  3. [WPF 基础知识系列] —— 绑定中的数据校验Vaildation

    前言: 只要是有表单存在,那么就有可能有对数据的校验需求.如:判断是否为整数.判断电子邮件格式等等. WPF采用一种全新的方式 - Binding,来实现前台显示与后台数据进行交互,当然数据校验方式也 ...

  4. 解决Ubuntu14.04 下 E: Encountered a section with no Package: header 问题

    参考: ubuntu-E:Encountered a section with no Package: header的解决办法 解决Ubuntu14.04 下 E: Encountered a sec ...

  5. 【ABAP系列】SAP ABAP替代校验全解析

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP替代校验全解析 ...

  6. [每天解决一问题系列 - 0013] 如何修改WiX Burn内置的窗口

    问题描述: 我们产品的burn安装包仅支持.net 3.5 sp1以上,在只有.net 2.0的机器上会给用户弹一个窗口,告诉用户为什么不能够安装的原因.本来burn已经内置了,但是在日文操作系统下, ...

  7. [每天解决一问题系列 - 0012] 如何通过程序获取IIS站点信息

    问题描述: 在WiX中需要判断某个站点是否存在,WiX没有这个能力,该怎么做呢? 解决方案: 解决方法就是写一个Custom Action来检测,实现的途径也有很多,现在想到了这么几个 1)Power ...

  8. Wix Burn:如何将32位和64位的安装包制作成一个安装包

    由于Windows Installer不是平台独立的(即区分32-bit和64-bit),因此用Wix制作的安装包在编译不能像.net应用那样采用Any CPU编译,而必须制定是目标Platform是 ...

  9. [每天解决一问题系列 - 0008] 关于.net framework 路径最大长度的问题

    问题描述: 有时候,在copy文件的时候,会提示目录长度太大,无法copy 解决方法: 可以使用Long Path Tool 解决问题 相关解释: http://blogs.msdn.com/b/bc ...

随机推荐

  1. D. Kilani and the Game(多源BFS)

    题目来源:http://codeforces.com/contest/1105/problem/D 题意:编号为1-k的点在一张n*m的表格中依次扩散,每个结点有各自的扩散速度且只可以往上下左右四个方 ...

  2. 545. Boundary of Binary Tree二叉树的边界

    [抄题]: Given a binary tree, return the values of its boundary in anti-clockwise direction starting fr ...

  3. includes() 方法

    字符串的includes()和数组中的includes()判断有没有括号里面的值,有的话为true,没有为false. 详细解析:https://blog.csdn.net/wu_xianqiang/ ...

  4. [leetcode]31. Next Permutation下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  5. echo 转义字符的使用

    man echo 查看 echo 的使用文档 -n 不尾随换行符 -e 启用解释反斜杠的转义功能 -E 禁用解释反斜杠的转义功能(默认) --help 显示此帮助信息并退出 --version 显示版 ...

  6. Vc 检测内存泄漏

    启用内存泄漏检测 检测内存泄漏是 C/c + + 调试器和 C 运行时库 (CRT) 的主要工具调试堆函数. 若要启用调试堆的所有函数,在 c + + 程序中,按以下顺序包含以下语句: C++复制 # ...

  7. JavaSE 初学进度条JProgressBar

    预备知识 创建进度条类后将其直接加入JFrame看看效果 public class JProgressBarDemo2 { public static void main(String args[]) ...

  8. 关于esp32的省电模式的WiFi连接

    对于ESP32,其作为一款集成了2.4GHz WiFi和蓝牙双模块的单芯片,所有基于wifi和蓝牙开发是学习esp32的重要一环,今天WiFi原理和网络结构 可以点击链接进行详细的了解,这里就不做详细 ...

  9. codeforces 1042 e

    逆推期望 #include<bits/stdc++.h> using namespace std; #define ll long long #define pb(x) push_back ...

  10. unigui结合JS方法记录

    在js中界面上所有组件都当成html里来控制 .控制按钮事件  document.getElementById(MainForm.UniButton4.getId()).click(); 这个方法让J ...