2012-02-28 10 views
15

WiXインストーラは、.NET 4.0 WinFormsアプリケーションをWindows Vistaおよび7台のデスクトップに展開します。アプリケーションには、.NET patch(KB2468871)が必要なPortable Class Libraryが含まれています。パッチを前提条件としてインストールする必要があります。インストール中にWindows QFE /パッチを検出して要求する

(#1の変化であるかもしれない)のClickOnceを使用して前提条件として Portable Library Tools
  • をインストールKB2468871パッチをダウンロードし、
  • それをインストール:パッチを適用することができ、様々な方法があります。

    a similar questionのアドバイスを使用して、CustomActionを作成し、私が示したQFE(#1)が見つかったときにtrueを返すかどうかを確認しました。

    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を目撃していない。

    パッチが適用されているかどうかを検出する良い方法はありますか?

  • 答えて

    13

    Win32_QuickFixEngineeringはすべての更新を返しません。実際には、QFEに制限のみ更新を返す:Microsoft Windowsインストーラ(MSI)またはWindows 更新サイト(http://update.microsoft.com)によって供給

    更新は のWin32_QuickFixEngineeringによって返されません。

    あなたが行っている更新はMSIパッチです。適用されるMSIパッチを照会するMicrosoft.Deployment.WindowsInstaller(別名DTF - Deployment Tools FoundationWiX toolsetの一部)を使用する:この場合

    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つの更新プログラムの一つです。

    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 
    
    +0

    このアプローチを検証しています。あなたの答えをありがとう! –

    10

    私は似たような状況で遊んでてきたと@KMorazの答えはほとんど右であることが判明:以下は、更新がマシンに適用されている場合はtrueを返します。 (注:@KMoraz、私はこれをコメントとして残していますが、まだ担当者がいません!)

    Microsoft.Deployment.WindowsInstaller名前空間が移動する方法のようですが、製品コードによるフィルタリングはあまりにも厳しいかもしれません。パッチがマシンにインストールされていて、製品コード{F5B09CFD-F0B2-36AF-8DF4-1DF6B63FC7B4}または{8E34682C-8118-31F1-BC4C-98CD9675E1C2}と関連付けられていない問題が発生しました。

    代わりにPatchInstallation.AllPatchesを使用しました。これは、システムにインストールされているパッチのフィルタリングされていないリストを返し、linqを使って答えを探します。

    public static bool CheckForPatch() 
    { 
        return IsPatchAlreadyInstalled("KB2468871") 
    } 
    
    public static bool IsPatchAlreadyInstalled(string patchCode) 
    { 
        var patches = PatchInstallation.AllPatches.ToList(); 
        patches.ForEach(x => Console.WriteLine("--found patch {0} for {1}",x.DisplayName,x.ProductCode)); 
        return patches.Any(patch => patch.DisplayName == patchCode); 
    } 
    

    出力例:

    --found patch Microsoft Office 2010 Service Pack 1 (SP1) for {90140000-001F-0409-0000-0000000FF1CE} 
    --found patch Update for Microsoft Office 2010 (KB2553270) 32-Bit Edition for {90140000-001F-0409-0000-0000000FF1CE} 
    --found patch Microsoft Office 2010 Service Pack 1 (SP1) for {90140000-001F-0C0A-0000-0000000FF1CE} 
    --found patch Update for Microsoft Office 2010 (KB2553270) 32-Bit Edition for {90140000-001F-0C0A-0000-0000000FF1CE} 
    --found patch Microsoft Office 2010 Service Pack 1 (SP1) for {90140000-001F-040C-0000-0000000FF1CE} 
    --found patch Update for Microsoft Office 2010 (KB2553270) 32-Bit Edition for {90140000-001F-040C-0000-0000000FF1CE} 
    --found patch KB2533523 for {3C3901C5-3455-3E0A-A214-0B093A5070A6} 
    --found patch KB2518870 for {3C3901C5-3455-3E0A-A214-0B093A5070A6} 
    --found patch KB2656351 for {3C3901C5-3455-3E0A-A214-0B093A5070A6} 
    --found patch KB2633870 for {3C3901C5-3455-3E0A-A214-0B093A5070A6} 
    --found patch KB2468871 for {3C3901C5-3455-3E0A-A214-0B093A5070A6} 
    --found patch KB2572078 for {3C3901C5-3455-3E0A-A214-0B093A5070A6} 
    --found patch KB2533523 for {0A0CADCF-78DA-33C4-A350-CD51849B9702} 
    --found patch KB2656351 for {0A0CADCF-78DA-33C4-A350-CD51849B9702} 
    --found patch KB2468871 for {0A0CADCF-78DA-33C4-A350-CD51849B9702} 
    --found patch KB2487367 for {0A0CADCF-78DA-33C4-A350-CD51849B9702} 
    
    +0

    私はちょうどOPの質問をターゲットにしていた...とにかく、あなたのポストに感謝 - 私はそれを32ビットのGUIDで更新しました。 – KMoraz

    +0

    ニース。あなたの答えはよく見え、とても役に立ちました。 – jstromwick

    10

    誰が、まだ2015年にこれを実行しようとしている場合は、私は(@KMorazから製品コードを使用して)次のフラグメントを使用してバーンのWiXでこれを達成:

    <!-- KB2468871 update to support portable class libraries (PCL) on XP --> 
    <Fragment> 
        <!-- codes from http://stackoverflow.com/a/9506530 --> 
        <util:ProductSearch ProductCode="{0A0CADCF-78DA-33C4-A350-CD51849B9702}" 
             Variable="KB2468871_NET32_Installed" /> 
        <util:ProductSearch ProductCode="{8E34682C-8118-31F1-BC4C-98CD9675E1C2}" 
             Variable="KB2468871_NET64_Installed" /> 
    
        <PackageGroup Id="NDP40_KB2468871_v2"> 
        <ExePackage Id="NDP40_KB2468871_v2_x86" Compressed="no" Vital="yes" Permanent="yes" 
           SourceFile="NDP40-KB2468871-v2-x86.exe" 
           DownloadUrl="http://download.microsoft.com/download/2/B/F/2BF4D7D1-E781-4EE0-9E4F-FDD44A2F8934/NDP40-KB2468871-v2-x86.exe" 
           DetectCondition="KB2468871_NET32_Installed" 
           InstallCondition="NOT VersionNT64" 
           InstallCommand="/q"/> 
    
        <ExePackage Id="NDP40_KB2468871_v2_x64" Compressed="no" Vital="yes" Permanent="yes" 
           SourceFile="NDP40-KB2468871-v2-x86.exe" 
           DownloadUrl="http://download.microsoft.com/download/2/B/F/2BF4D7D1-E781-4EE0-9E4F-FDD44A2F8934/NDP40-KB2468871-v2-x64.exe" 
           DetectCondition="KB2468871_NET64_Installed" 
           InstallCondition="VersionNT64" 
           InstallCommand="/q"/> 
        </PackageGroup> 
    </Fragment> 
    

    util名前空間には、Wix Util Extensionを指します。ルート要素にはxmlns:util="http://schemas.microsoft.com/wix/UtilExtension"が、WixUtilExtension.dllには参照が必要です。

    インストーラは、必要に応じて自動的にダウンロードされます。インストーラファイルは、ビルドにはSourceFileで指定された名前と同じ名前のWiXプロジェクトのルートにローカルに保存する必要がありますが、Compressednoに設定されているため、セットアップバンドルに追加されません。

    関連する問題