Вы можете использовать функции API MSI для перечисления всех установленных продуктов и запроса их свойств.Если вы замените MsiGetProductInfo
на MsiGetProductInfoEx
, вы сможете запросить дополнительную информацию, такую как контекст установки или SID пользователя, связанный с установкой.
Однакоэто не позволяет перечислять UpgradeCode
.Насколько я знаю, MSI не ведет записи, связывающие ProductCode
с UpgradeCode
;доступно только обратное сопоставление, и вы можете перечислить продукты, связанные с UpgradeCode
, используя функцию MsiEnumRelatedProducts
.
Ниже вы найдете пример кода, который перечисляет установленные или рекламируемые продуктыи их 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 ипоиск кода обновления.