如何获取系统上安装的软件产品列表。我的目标是遍历这些,并获得其中一些的安装路径。
PSEUDOCODE(结合多种语言:))
foreach InstalledSoftwareProduct
if InstalledSoftwareProduct.DisplayName LIKE *Visual Studio*
print InstalledSoftwareProduct.Path
答案 0 :(得分: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);
}
}
}
}
答案 1 :(得分:8)
您可以询问WMI Installed applications classes:Win32_Products
类代表Windows Installer安装的所有产品。例如,以下PS脚本将检索由Windows Installer安装的本地计算机上安装的所有产品:
Get-WmiObject -Class Win32_Product -ComputerName .
见Working with Software Installations。将PS查询转换为等效的C#使用WMI API(换句话说,Using WMI with the .NET Framework)留给读者练习。
答案 2 :(得分:0)
如果您需要的所有程序都将其安装路径存储在注册表中,您可以使用以下内容: http://visualbasic.about.com/od/quicktips/qt/regprogpath.htm(我知道它是VB但原理相同)。
我确信如果有些人不存储他们的安装路径(或者模糊不清),可能有办法通过.NET获取程序列表,但我不知道。
答案 3 :(得分:0)
通过注册表最简单的方法
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();
}
}
}