我想知道是否可以从Windows中检索安装的应用程序列表,包括其GUID和升级GUID。我无法升级为我的某个程序工作,并且需要检查旧版本程序的这些值。谢谢你的帮助!
答案 0 :(得分:2)
您可以使用MSI api函数枚举所有已安装的产品并查询其属性。如果将MsiGetProductInfo
替换为MsiGetProductInfoEx
,您将能够查询其他信息,例如安装上下文或与安装相关联的用户SID。
但是,这不允许您枚举UpgradeCode
。据我所知,MSI没有保留将ProductCode
与UpgradeCode
相关联的记录;只有反向映射可用,您可以使用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。