2011-12-23 10 views
0

インストールされた製品を識別するGUIDが与えられていると、C#でその製品にインストールされているパッチを見つけることができますか?パッチ情報にアクセスしますか?

アプリケーションはかなり複雑で、時にはOrca/MSIを使用してパッチ(MSPファイル)を作成します。これらのパッチは、お客様のコンピュータにインストールして、「インストールされた更新プログラムの表示」の「プログラムと機能」で表示することができます。私はWin32_Productの中に私の物を見つけ、そこに 情報を取得することができますWMIを使用して

  1. 私は2つのアプローチを試みました。しかし、 Win32_PatchPackageまたはWin32_Patchのどちらかを照会して 「ProductCode」と照合すると、私は希望の情報を含む にキャプション/ディスクリプションが必要だと思っていたが、私が得るのは別のものである。 GUIDのセットはそれぞれ何のためにはっきりしていないようだ。

  2. 同様に、レジストリ私は ます。HKLM \ Software \ Microsoft \アンインストール\\下(製品を見つけることができる、といくつかの掘削で、私は パッチを見つけることができますを使用して( ます。HKLM \ Software \ Microsoft \ Installerの下の\ UserDataを\ S-1-5-18 \製品\) が、鍵が明らかにされていません。それは私の製品 インストーラGUIDと同じではありません。

This question同様の問題について説明しますが、質問者を探していましたWindowsパッチのために、私は自分自身のアプリケーションパッチが必要ですが、実際には解決策はありません。

ありがとうございます。

答えて

0

私はWin32_PatchPackageから返されたProductCodeをWin32 dllに差し込み、それを使ってこれを実現することができました。

[DllImport("msi.dll", CharSet = CharSet.Unicode)] 
    internal static extern Int32 MsiGetPatchInfoEx(string szPatchCode, string szProductCode, string szUserSid, int dwContext, string szProperty, [Out] StringBuilder lpValue, ref Int32 pcchValue); 

    // See http://msdn.microsoft.com/en-us/library/windows/desktop/aa370128%28v=vs.85%29.aspx 
    // for valid values for the property paramater 
    private static string getPatchInfoProperty(string patchCode, string productCode, string property) 
    { 
     StringBuilder output = new StringBuilder(512); 
     int len = 512; 
     MsiGetPatchInfoEx(patchCode, productCode, null, 4, property, output, ref len); 
     return output.ToString(); 
    } 

    public static string GetPatchDisplayName(string patchCode, string productCode) 
    { 
     return getPatchInfoProperty(patchCode, productCode, "DisplayName"); 
    } 
関連する問題