如何获取已安装软件产品的列表?

esa*_*sac 4 c# windows

如何获取系统上安装的软件产品列表.我的目标是遍历这些,并获得其中一些的安装路径.

PSEUDOCODE(结合多种语言:))

foreach InstalledSoftwareProduct
    if InstalledSoftwareProduct.DisplayName LIKE *Visual Studio*
        print InstalledSoftwareProduct.Path
Run Code Online (Sandbox Code Playgroud)

Dir*_*mar 12

您可以使用MSI api函数枚举所有已安装的产品.您将在下面找到执行此操作的示例代码.

在我的代码中,我首先枚举所有产品,获取产品名称,如果它包含字符串"Visual Studio",我检查InstallLocation属性.但是,并不总是设置此属性.我不确定这是否是检查的正确属性,或者是否有另一个属性始终包含目标目录.也许从InstallLocation酒店取回的信息对您来说足够了?

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 (
            0 == MsiEnumProducts(iIdx++, sbProductCode))
        {
            Int32 productNameLen = 512;
            StringBuilder sbProductName = new StringBuilder(productNameLen);

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

            if (sbProductName.ToString().Contains("Visual Studio"))
            {
                Int32 installDirLen = 1024;
                StringBuilder sbInstallDir = new StringBuilder(installDirLen);

                MsiGetProductInfo(sbProductCode.ToString(),
                    "InstallLocation", sbInstallDir, ref installDirLen);

                Console.WriteLine("ProductName {0}: {1}", 
                    sbProductName, sbInstallDir);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Rem*_*anu 8

您可以询问WMI Installed应用程序类:Win32_Products该类表示Windows Installer安装的所有产品.例如,以下PS脚本将检索由Windows Installer安装的本地计算机上安装的所有产品:

Get-WmiObject -Class Win32_Product -ComputerName .
Run Code Online (Sandbox Code Playgroud)

请参阅使用软件安装.将PS查询转换为等效的C#使用WMI API(换句话说,将WMI与.NET Framework一起使用)留给读者练习.