2010-08-19 3 views
4

Как получить список программных продуктов, которые установлены в системе. Моя цель состоит в том, чтобы перебирать их и получить путь к установке нескольких из них.Как получить список установленных программных продуктов?

ПСЕВДОКОД (объединение нескольких языков :))

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

Я серьезно сомневаюсь, что вы можете сделать это в системе Windows. Большинство программ предлагают собственный установщик, не говоря уже о том, как определить, установлено ли программное обеспечение. – alternative

+0

@mathepic: на самом деле подавляющее большинство программ предлагает установщик, который является оболочкой или другой поверх установки .msi (ака. Установщик Windows). –

ответ

11

Вы можете использовать функции api MSI для перечисления всех установленных продуктов. Ниже вы найдете пример кода, который делает это.

В моем коде я сначала перечисляю все продукты, получаю имя продукта, и если он содержит строку «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); 
      } 
     } 
    } 
} 
0

Ну, если все программы, нужно хранить их установки пути на реестре, вы можете использовать что-то вроде: http://visualbasic.about.com/od/quicktips/qt/regprogpath.htm (я знаю, что это VB, но тот же принцип) ,

Я уверен, что, возможно, есть способ получить список программ через .NET, если некоторые из них не хранят свои пути установки (или делают это неясно), но я этого не знаю.

8

Вы можете задать WMI Installed applications classes: класс Win32_Products представляет все продукты, установленные установщиком Windows. Например следующий PS скрипт будет получать все Prodcuts установленные на локальном компьютере, которые были установлены установщиком Windows:

Get-WmiObject -Class Win32_Product -ComputerName . 

См Working with Software Installations. Посылка запроса PS на эквивалентное использование C# API WMI (другими словами Using WMI with the .NET Framework) остается в качестве упражнения для читателя.

+0

Команда Awesome Powershell! Мне было весело писать сценарий, который бы сравнил то, что установлено на компьютерах A и B, но не C и D (что-то работало в первой группе, но не во втором :)). –

+1

Остерегайтесь использования Win32_Product из-за некоторых неприятных побочных эффектов, как описано здесь [ссылка] (http://sdmsoftware.com/wmi/why-win32_product-is-bad-news/) –

+0

@BobM: http://support.microsoft .com/kb/974524. –

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(); 
     } 


    } 
} 
Смежные вопросы