2010-10-05 68 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