我正在尝试修改WIX安装程序包,以便它可以检测是否存在特定的Microsoft知识库补丁/更新,然后如果补丁是,则为用户提供即时下载和安装的机会没有发现。我的操作顺序是:
VersionNT
进行比较)。步骤2
和3
对我来说不是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补丁,或者我是否必须实现我的从零开始自己的方法?
谢谢。
答案 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