Как получить список установленных программных продуктов? - PullRequest
4 голосов
/ 20 августа 2010

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

PSEUDOCODE (объединение нескольких языков :))

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

Ответы [ 4 ]

12 голосов
/ 20 августа 2010

Вы можете использовать функции 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);
            }
        }
    }
}
8 голосов
/ 20 августа 2010

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

Get-WmiObject -Class Win32_Product -ComputerName .

См. Работа с установками программного обеспечения .PO-запрос на эквивалентное использование C # API WMI (другими словами Использование WMI с .NET Framework ) оставлен читателю в качестве упражнения.

0 голосов
/ 12 июля 2017

Самые простые способы через реестр

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


    }
}
0 голосов
/ 20 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...