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

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

PSEUDOCODE(结合多种语言:))

foreach InstalledSoftwareProduct if InstalledSoftwareProduct.DisplayName LIKE *Visual Studio* print InstalledSoftwareProduct.Path 

您可以使用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); } } } } 

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

 Get-WmiObject -Class Win32_Product -ComputerName . 

请参阅使用软件安装 。 将PS查询指向等效的C#使用WMI API(换言之, 将WMI与.NET Framework一起使用 )作为练习留给读者。

那么如果你需要的所有程序在注册表中存储他们的安装路径,你可以使用类似于: http : //visualbasic.about.com/od/quicktips/qt/regprogpath.htm (我知道这是VB,但同样的原则)。

我敢肯定,如果有一些不存储他们的安装路径(或者不明确地),可能有一种方法可以通过.NET获取程序列表,但是我不知道。

最简单的方法通过注册表

 using Microsoft.Win32; using System; using System.Collections.Generic; using System.Text; using System.IO; namespace SoftwareInventory { class Program { static void Main(string[] args) { //!!!!! Must be launched with a domain administrator user!!!!! Console.ForegroundColor = ConsoleColor.Green; StringBuilder sbOutFile = new StringBuilder(); Console.WriteLine("DisplayName;IdentifyingNumber"); sbOutFile.AppendLine("Machine;DisplayName;Version"); //Retrieve machine name from the file :File_In/collectionMachines.txt //string[] lines = new string[] { "NameMachine" }; string[] lines = File.ReadAllLines(@"File_In/collectionMachines.txt"); foreach (var machine in lines) { //Retrieve the list of installed programs for each extrapolated machine name var registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; using (Microsoft.Win32.RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, machine).OpenSubKey(registry_key)) { foreach (string subkey_name in key.GetSubKeyNames()) { using (RegistryKey subkey = key.OpenSubKey(subkey_name)) { //Console.WriteLine(subkey.GetValue("DisplayName")); //Console.WriteLine(subkey.GetValue("IdentifyingNumber")); if (subkey.GetValue("DisplayName") != null && subkey.GetValue("DisplayName").ToString().Contains("Visual Studio")) { Console.WriteLine(string.Format("{0};{1};{2}", machine, subkey.GetValue("DisplayName"), subkey.GetValue("Version"))); sbOutFile.AppendLine(string.Format("{0};{1};{2}", machine, subkey.GetValue("DisplayName"), subkey.GetValue("Version"))); } } } } } //CSV file creation var fileOutName = string.Format(@"File_Out\{0}_{1}.csv", "Software_Inventory", DateTime.Now.ToString("yyyy_MM_dd_HH_mmssfff")); using (var file = new System.IO.StreamWriter(fileOutName)) { file.WriteLine(sbOutFile.ToString()); } //Press enter to continue Console.WriteLine("Press enter to continue !"); Console.ReadLine(); } } }