Windows GUID或应用程序列表

时间:2010-10-05 11:20:09

标签: windows guid

我想知道是否可以从Windows中检索安装的应用程序列表,包括其GUID和升级GUID。我无法升级为我的某个程序工作,并且需要检查旧版本程序的这些值。谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用MSI api函数枚举所有已安装的产品并查询其属性。如果将MsiGetProductInfo替换为MsiGetProductInfoEx,您将能够查询其他信息,例如安装上下文或与安装相关联的用户SID。

但是,这不允许您枚举UpgradeCode。据我所知,MSI没有保留将ProductCodeUpgradeCode相关联的记录;只有反向映射可用,您可以使用MsiEnumRelatedProducts函数枚举与UpgradeCode相关的产品。

您将在下面找到使用C#枚举已安装或广告产品及其ProductCode的示例代码:

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。