WIX - 自动检测并安装MS KB补丁

时间:2015-12-05 00:31:30

标签: wix windows-installer wix3.8 windows-update

我正在尝试修改WIX安装程序包,以便它可以检测是否存在特定的Microsoft知识库补丁/更新,然后如果补丁是,则为用户提供即时下载和安装的机会没有发现。我的操作顺序是:

  1. 检测用户是否在Windows 8.1上安装(无关紧要,与VersionNT进行比较)。
  2. 检测是否已安装KB 2883200
  3. 如果检测到,请提供一个对话框,提供下载和安装软件包的机会。
  4. 步骤23对我来说不是100%明显。 I've found a possible solution via another StackOverflow post,但我不明白为什么需要提供哈希值和KB号码。例如:

    示例函数

    public static bool IsPatchAlreadyInstalled(string productCode, string patchCode)
    {
        var patches = 
            PatchInstallation.GetPatches(null, productCode, null, UserContexts.Machine, PatchStates.Applied);
    
        return patches.Any(patch => patch.DisplayName == patchCode);
    }
    

    使用

    IsPatchAlreadyInstalled("{F5B09CFD-F0B2-36AF-8DF4-1DF6B63FC7B4}", "KB2468871");// .NET Framework 4 Client Profile 64-bit
    IsPatchAlreadyInstalled("{8E34682C-8118-31F1-BC4C-98CD9675E1C2}", "KB2468871");// .NET Framework 4 Extended 64-bit
    IsPatchAlreadyInstalled("{3C3901C5-3455-3E0A-A214-0B093A5070A6}", "KB2468871");// .NET Framework 4 Client Profile 32-bit
    IsPatchAlreadyInstalled("{0A0CADCF-78DA-33C4-A350-CD51849B9702}", "KB2468871");// .NET Framework 4 Extended 32-bit
    

    所以,我的问题的第一部分是:我如何使用上面的代码来检测是否安装了KB 2883200补丁,以及如何为传递给的第一个参数生成适当的散列/ UUID功能?

    接下来,我试图制作一个模态对话框,为用户提供安装补丁的机会?如果用户进入"返回"在安装程序中,如果他们意外拒绝安装驱动程序的提议,我希望在再次达到相应步骤时重新显示对话框。

    对于我的问题的第二部分和最后一部分:我如何提供这样的对话框,是否有任何现有的方法通过安装程序下载和安装MS KB补丁,或者我是否必须实现我的从零开始自己的方法?

    谢谢。

1 个答案:

答案 0 :(得分:2)

该对话框将是您在MSI UI序列中插入的对话框,如果未安装更新,则显示该对话框,并发布带有条件的对话框。在UI序列中执行任何此操作的潜在问题是您不会被提升,因此如果需要提升权限,您可能会遇到一些困难。

我认为Tom的建议就是这样做 - 让它成为你构建自己的可执行文件以检查它的先决条件,并将其与Burn集成。

无论哪种方式,要检查并安装更新,我都会使用Windows Update API。此更新可通过Windows Update获得,此类内容告诉您更新是否适用于特定系统并且还将下载:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa387102(v=vs.85).aspx