在安装期间检测并要求 Windows QFE/补丁 [英] Detect and require a Windows QFE/patch for during installation

查看:14
本文介绍了在安装期间检测并要求 Windows QFE/补丁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们的 WiX 安装程序将 .NET 4.0 WinForms 应用程序部署到 Windows Vista 和 7 桌面.该应用程序包括一个需要 .NET 补丁 (KB2468871).我们需要安装补丁作为先决条件.可以通过多种方式应用补丁:

Our WiX installer deploys a .NET 4.0 WinForms application to Windows Vista and 7 desktops. The application includes a Portable Class Library that requires a .NET patch (KB2468871). We need to install the patch as a prerequisite. There are various ways that the patch can be applied:

  1. 下载 KB2468871 补丁并安装
  2. 安装便携式库工具
  3. 作为使用 ClickOnce 的先决条件(可能是 #1 的变体)

使用来自 一个类似的问题,我创建了一个 CustomAction 来检查我演示的 QFE (#1) 在找到时返回 true.

Using advice from a similar question, I created a CustomAction to check for the QFE (#1) that I demonstrated returns true when found.

private static bool IsPatchAlreadyInstalled()
{
    // If the patch is installed, we can find it using WMI
    var query = new SelectQuery("SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = 'Q2468871' OR HotFixID = 'KB2468871'");
    var results = new ManagementObjectSearcher(query).Get();
    return results.Count > 0;
}

不幸的是,这在我的开发机器上失败了,因为补丁是作为工具 (#2) 的一部分安装的.我还没有看到情况 #3.

Unfortunately, this fails on my dev machine as the patch was installed as part of the Tools (#2). I haven't witnessed situation #3 yet.

检测补丁是否已应用的更好方法是什么?

What is a better way to detect if the patch has been applied?

推荐答案

Win32_QuickFixEngineering 不会返回所有更新.实际上,它只返回仅限于 QFE 的更新:

Win32_QuickFixEngineering won't return all updates. Actually, it returns only updates restricted to QFE:

由 Microsoft Windows Installer (MSI) 或 Windows 提供的更新更新站点 (http://update.microsoft.com) 不返回Win32_QuickFixEngineering.

Updates supplied by Microsoft Windows Installer (MSI) or the Windows update site (http://update.microsoft.com) are not returned by Win32_QuickFixEngineering.

您所追求的更新是一个 MSI 补丁.使用 Microsoft.Deployment.WindowsInstaller(又名 DTF - 部署工具基础WiX 工具集的一部分) 查询应用的 MSI 补丁:

The update you're after is an MSI patch. Use Microsoft.Deployment.WindowsInstaller (aka DTF - Deployment Tools Foundation, part of the WiX toolset) to query the applied MSI patches:

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);
}

在这种情况下,KB2468871 是 .NET Framework 4 更新之一.如果机器上已应用更新,则以下内容将返回 true:

In this case, KB2468871 is one of .NET Framework 4 updates. The following will return true if the updates have been applied on the machine:

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

这篇关于在安装期间检测并要求 Windows QFE/补丁的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆