Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Получение списка установленных программ


Автор: sosedoff 26.1.2008, 23:31
Здравствуйте господа..
Кто знает, как можно получить список установленных программ, с указанием пути установки?

Автор: Stepan_Lameroff 27.1.2008, 18:45
Смотрите в реестре HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
или WMI http://msdn2.microsoft.com/en-us/library/aa394378.aspx

Автор: windOFchange 4.4.2008, 13:37
Сделал по этому методу, и сталкнулся с такой проблемой. Название проги "живёт" в ключе DisplayName. То есть перебирая все ключи из приведённого выше поста поидее можно достать все названия прог установленных в системе (этот способ как раз и указывают во всех постах инета). НО! во первых этот ключ иногда бывает пустым (Alcohol например), кроме того там может быть записана совсем какая то левая инфа. Например ставлю прогу Лан агент, она в этом ключе пишет "система". И чего вот с этим делать? При этом когда смотрю в "установка и удаление программ" эти проги названы по человечески... в чём же дело? Откуда тогда их берёт винда? Может есть ещё места хранения списка реально инсталлированного софта? Пожалуйста ответьте...

Автор: Rififi 4.4.2008, 22:45
Цитата(windOFchange @  4.4.2008,  13:37 Найти цитируемый пост)
Может есть ещё места хранения списка реально инсталлированного софта?

http://msdn2.microsoft.com/en-us/library/aa370102(VS.85).aspx

Автор: windOFchange 6.4.2008, 16:14
нда... как то там всё нерусским по белому написано...  smile  а чуть попонятнее можно написать?

Автор: Levon11 22.7.2008, 17:55
А как это использовать??? smile 

Автор: Wanderer2019 22.7.2008, 19:18
возможно что то вроде этого 

Код

 [DllImport("msi.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int MsiEnumProducts(int iProductIndex, StringBuilder lpProductBuf);

        [DllImport("msi.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern Int32 MsiGetProductInfo(string product, string property, [Out] StringBuilder valueBuf, ref Int32 len); 

        static void Main(string[] args)
        {
             StringBuilder sb = new StringBuilder(39);
            
             MsiEnumProducts(index, sb)
            
             int len = 512;
             StringBuilder productname = new StringBuilder(len);

             MsiGetProductInfo(
                    sb.ToString(),
                    "InstalledProductName", 
                    productname , 
                    ref len);

              Console.WriteLine(productname.ToString());
        }

Автор: Kolovorot 16.2.2011, 16:58
Цитата(Wanderer2019 @ 22.7.2008,  19:18)
возможно что то вроде этого 

Код

 [DllImport("msi.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int MsiEnumProducts(int iProductIndex, StringBuilder lpProductBuf);

        [DllImport("msi.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern Int32 MsiGetProductInfo(string product, string property, [Out] StringBuilder valueBuf, ref Int32 len); 

        static void Main(string[] args)
        {
             StringBuilder sb = new StringBuilder(39);
            
             MsiEnumProducts(index, sb)
            
             int len = 512;
             StringBuilder productname = new StringBuilder(len);

             MsiGetProductInfo(
                    sb.ToString(),
                    "InstalledProductName", 
                    productname , 
                    ref len);

              Console.WriteLine(productname.ToString());
        }

Случайно никто не знает как это можно использовать для конкретного компьютера в домене и можно ли узнать количество установленного ПО?

Автор: jonie 16.2.2011, 22:45
Kolovorot, через WMI можно всяко, насчет MSI* функций крайне не уверен...

Автор: Kolovorot 17.2.2011, 00:00
Про WMI знаю. Но по моему у него есть один существенный недостаток  описаный выше:
 "Сделал по этому методу, и сталкнулся с такой проблемой. Название проги "живёт" в ключе DisplayName. То есть перебирая все ключи из приведённого выше поста поидее можно достать все названия прог установленных в системе (этот способ как раз и указывают во всех постах инета). НО! во первых этот ключ иногда бывает пустым (Alcohol например), кроме того там может быть записана совсем какая то левая инфа. Например ставлю прогу Лан агент, она в этом ключе пишет "система". И чего вот с этим делать? При этом когда смотрю в "установка и удаление программ" эти проги названы по человечески... в чём же дело? Откуда тогда их берёт винда? Может есть ещё места хранения списка реально инсталлированного софта? Пожалуйста ответьте..."

Автор: jonie 17.2.2011, 10:41
Kolovorot, ладно, фиг с ним с WMI. Что насчет удаленного реестра?)

Автор: Kolovorot 17.2.2011, 10:58
Цитата(jonie @ 17.2.2011,  10:41)
Kolovorot, ладно, фиг с ним с WMI. Что насчет удаленного реестра?)

Так там вроде та же проблема. Но я уже согласен и на удаленный реестр. smile 

Автор: krulik 24.2.2011, 19:04
Kolovorot, 
Цитата(Kolovorot @  17.2.2011,  00:00 Найти цитируемый пост)
Может есть ещё места хранения списка реально инсталлированного софта

для "установка и удаление программ" Винда значения берет только из Uninstall ветки.

по поводу ситуации с "Лан агентом" и подобными прогами. Очень часто врстечал следующую ситуацию:

в Uninstall ветке инсталятор может создать 1,2,3 и т.д ключей (так уж разработчик инсталяхи придумал себе).
К примеру может получится что вы увидите ключ "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{00000000-0000-0000-0000-000000000000}" у которого DisplayName пустой или с левой инфой (но вы уверены что это имено нужный вам продукт), но тут же вы можете увидеть параметр SystemComponent=1 (эта фигня прячет запись из "установка и удаление программ"). Если это ваш случай, то ищите в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall еще один ключ, у которого DisplayName такой как и в "установка и удаление программ". Причем этот второй ключ может не с гуидом быть, а просто с именем продуката: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\LanAgent.


Автор: Migelь 16.1.2012, 20:54
Вопрос в тему, можно как-то отслеживать установку\удаления программ, если не запоминать список установленных программ?

Автор: Migelь 16.1.2012, 23:14
Цитата(Migelь @ 16.1.2012,  20:54)
Вопрос в тему, можно как-то отслеживать установку\удаления программ, если не запоминать список установленных программ?

Вопрос снят, протоколирование реестра как вариант ответа.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)