2010-10-05 46 views
0

我想知道是否可以從Windows中檢索已安裝的應用程序的列表,包括它們的GUID和升級GUID。我在升級到我的某個程序時遇到問題,需要檢查舊版本程序的這些值。謝謝您的幫助!Windows GUID或應用程序列表

回答

2

您可以使用MSI API函數來枚舉所有已安裝的產品並查詢其屬性。如果您將MsiGetProductInfo替換爲MsiGetProductInfoEx,您將能夠查詢其他信息,例如與安裝關聯的安裝上下文或用戶SID。

但是,這不允許您枚舉UpgradeCode。據我所知,MSI沒有保留一條記錄,將ProductCodeUpgradeCode關聯;只有反向映射可用,您可以使用MsiEnumRelatedProducts函數枚舉與UpgradeCode相關的產品。

下面你會發現其中列舉了安裝或標榜產品及其ProductCode使用C#示例代碼:

using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 
using System.Text; 

class Program 
{ 
    [DllImport("msi.dll", CharSet = CharSet.Unicode)] 
    static extern Int32 MsiGetProductInfo(string product, string property, 
     [Out] StringBuilder valueBuf, ref Int32 len); 

    [DllImport("msi.dll", SetLastError = true)] 
    static extern int MsiEnumProducts(int iProductIndex, 
     StringBuilder lpProductBuf); 

    static void Main(string[] args) 
    { 
     StringBuilder sbProductCode = new StringBuilder(39); 
     int iIdx = 0; 
     while (MsiEnumProducts(iIdx++, sbProductCode) == 0) 
     { 
      Int32 productNameLen = 512; 
      StringBuilder sbProductName = new StringBuilder(productNameLen); 

      MsiGetProductInfo(sbProductCode.ToString(), 
       "ProductName", sbProductName, ref productNameLen); 

      Console.WriteLine("Product: {0}\t{1}", sbProductName, sbProductCode); 
     } 
    } 
} 

更新

如果您仍然有以前版本的MSI安裝程序即可只需使用Orca打開文件並搜索UpgradeCode即可。

+0

我當然用Orca打開了MSI,一切都結束了,但我只是想直接用Windows檢查,看看在初始安裝過程中是否發生了任何奇怪的事情。升級代碼是相同的,升級只是不起作用。請參閱http://stackoverflow.com/questions/3863171/wix3-major-upgrade-not-working – Adkins 2010-10-05 12:09:31