powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как определить установлен ли продукт?
25 сообщений из 48, страница 1 из 2
Как определить установлен ли продукт?
    #39581979
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и найти путь к нему?

Т.е. например, есть приложение А, которое на старте определяет, установлено ли приложение Б в системе, и если да то добавляет себе в меню запуск ехе по обнаруженному пути.

Попробовал такой путь:
https://stackoverflow.com/questions/908850/get-installed-applications-in-a-system


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
       object line;
            string softwareinstallpath = string.Empty;
            string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
            using (var baseKey = Microsoft.Win32.RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
            {
                using (var key = baseKey.OpenSubKey(registry_key))
                {
                    foreach (string subkey_name in key.GetSubKeyNames())
                    {
                        using (var subKey = key.OpenSubKey(subkey_name))
                        {
                            line = subKey.GetValue("DisplayName");
                            if (line != null && (line.ToString().ToUpper().Contains("SPARK")))
                            {

                                softwareinstallpath = subKey.GetValue("InstallLocation").ToString();
                                listBox1.Items.Add(subKey.GetValue("InstallLocation"));
                                break;
                            }
                        }
                    }
                }
            }



Но оказалось, что InstallLocation во многих случаях пустой, и определить факт, что продукт установлен - можно, но найти путь к нему - остается вопросом
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39581982
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256k, в виндах нет единого механизма для этого. Только анализировать конкретное приложение и смотреть где и как оно следы оставляет.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39581990
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256k string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";

ИМХО, для приложения с классическим инсталлером это правильный путь.
Я во всяком случае так проверяю при установке, установлено ли УЖЕ мое это приложение и вычисляю путь к un-инсталлеру (а заодно и ко всему остальному, что лежит там же).
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39581998
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77256k string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";

ИМХО, для приложения с классическим инсталлером это правильный путь.
Я во всяком случае так проверяю при установке, установлено ли УЖЕ мое это приложение и вычисляю путь к un-инсталлеру (а заодно и ко всему остальному, что лежит там же).

Это да, но как найти путь, где установлен продукт?

InstallLocation - пустой.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582003
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pu4koff,
Почему? WinInstall это бд в винде. Там в табличках все есть.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582010
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256kЭто да, но как найти путь, где установлен продукт?
InstallLocation - пустой.
Ну, ты же знаешь какой конкректно продукт ты ищешь.
Напр, UninstallString - путь к де-инсталлеру, а он как правило лежит в папке с продуктом.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582022
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Pu4koff,
Почему? WinInstall это бд в винде. Там в табличках все есть.
WinInstall - это msi инсталляторы или что?
Часть программ ставится тупо как распаковка архива и нигде никак не оставляют о себе информацию. У части какие-то свои самодельные инсталляторы, у каждого свои заморочки. Какие-то программы ставятся на машину, какие-то - на пользователя. В винде никакой обязаловки на этот счёт нет. Даже разные продукты Microsoft ведут себя как хотят и нет никакой политики партии и единства. Инсталляторы же делаются, чтобы ставилось ПО и работало, а какая-то там вспомогательная и необязательная информация - это никому не интересно.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582023
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77256kЭто да, но как найти путь, где установлен продукт?
InstallLocation - пустой.
Ну, ты же знаешь какой конкректно продукт ты ищешь.
Напр, UninstallString - путь к де-инсталлеру, а он как правило лежит в папке с продуктом.
или там будет msiexec.exe {GUID}
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582030
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pu4koffили там будет msiexec.exe {GUID}
Ну наверняка этот {GUID} известно где лежит...в том же реестре
хотя я msiexec.exe никогда не пользовал, не знаю.
Но общий мысль такой, что если продукт конкретный, то что-то конкретное (где лежит) про него вытянуть из реестра или откуда-то там можно.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582039
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Pu4koffили там будет msiexec.exe {GUID}
Ну наверняка этот {GUID} известно где лежит...в том же реестре
хотя я msiexec.exe никогда не пользовал, не знаю.
Но общий мысль такой, что если продукт конкретный, то что-то конкретное (где лежит) про него вытянуть из реестра или откуда-то там можно.
А может просто в Current User будет раздел Software\SPARK и там уже запись InstallPath или ExePath какой-нибудь. Об этом я сразу и написал, что нет тут серебряной пули и нужно смотреть по месту. ;)
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582051
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pu4koff,
Мы про те что стоят в Меню - Компьютер - Добавление и удаление программ.
Очевидно что не про портабле.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582100
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Pu4koff,
Мы про те что стоят в Меню - Компьютер - Добавление и удаление программ.
Очевидно что не про портабле.
Что-то типа официального источника такой информации я знаю только тот самый реестр, где ТС уже смотрел. Для x64 систем там еще одну соседнюю ветку можно смотреть Wow6432 или что-то в этом духе.
Админским штатным путём можно пожалуй считать WMI.
Например, в PowerShell можно выполнить скрипт:
Код: powershell
1.
gwmi win32_product | Select-Object Name, InstallLocation | Out-GridView


у меня лично большинство записей без пути установки, что собственно и не удивительно, т.к. источник информации тот же реестр.
Так что придётся таки изучать конкретный продукт и под него подстраиваться.
Варианты тут такие:
1) Программа хранит настройки в реестре и есть ветка с именем программы (обычно по имени называют, но могут и GUID использовать какой-нибудь) и разработчики туда записали путь к корневой папке
2) Программа обычно ставится в ассоциацию с непопулярным расширением, тогда в реестре в разделе по ассоциации с этим расширением можно взять расположение exe-файла программы. Дополнительно по имени exe-шника удостовериться, что это нужная программа и вырезать путь.
3) Тупо в лоб перебирать возможные популярные пути. Путь по-умолчанию естественно в первую очередь (не у всех программ инсталляторы хотят в програмфайлс устанавливать изначально, есть и ценители всяких C:\StroySoft\).
4) Пусть пользователь вообще сам показывает куда поставил стороннюю программу, а то обленились понимаешь. Раньше часто встречал программы, которые лениво пытались сами проставить дефолтный путь из пункта 3, а в случае облома давали пользователю самому выбирать куда он чего поставил. Причём этим грешили даже сами разработчики программы, когда ставилось обновление или плагин какой.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582138
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pu4koffWMI
+1
API мне больше нравится чем реестр. Мы же программисты)).
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582156
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Pu4koffWMI
+1
API...
Какие же это API? Это нехилая такая оболочка, часто тормознутая и с глюками.

Вот это список модемов через WMI

Вот это тоже самое через API
16059078

Разницу чувствуете?
WMI, да, пару строк кода.
API - простыня.
Но в указанном примере API отрабатывает мгновенно, а WMI "думает пару секунд, чего-то там запускает",
+ WMI при нек. условиях в конкретном примере может дать сбой (долго объяснять).

Если выбор между WMI и "тупо прочесть реестр", то быстрее и надежней второе.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582202
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
Пусть автор решает.
https://msdn.microsoft.com/en-us/library/windows/desktop/aa372454(v=vs.85).aspx
Я такое вообще в IDE инсталлятора делал.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582316
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Пусть автор решает.
Не спорю. Идей ему достаточно подкинули.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582318
Amiri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256k,

cmd
C:\Users\SPAWN>WMIC
wmic:root\cli>
"/?" for help, QUIT to Exit.
wmic:root\cli>/output:C:\windows\temp\apps.txt product get name,version

look apps.txt
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582341
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Petro123Пусть автор решает.
Не спорю. Идей ему достаточно подкинули.

Вроде и достаточно, а по сути - топчемся на месте.

В реестре значение ключа для анинстолла -

"или там будет msiexec.exe {GUID}"

П-ц.
WMI может быть не активен в общем случае.

Где-то есть в реестре путь, думалось, что есть какое-то известное место, а получается "как всегда"
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582365
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256k,
Ну, а что ты хотел?
Я вот например знаю куда моя программа чего пишет. И конечно найду ее, куда б юзер ее не засунул.
Еще я напр. знаю куда WinMail (вистовский) чего пишет, что уже не тривиально, поэтому я его юзаю на последнем Win10 в том числе, и плевать что MS его "убил" еще в семерке, не предоставив людям нормальной альтернативы.
Вот и ты должен потратить драгоценное свое время, чтоб выяснить куда чего пишет то что нужно конкретно тебе.
Оно поверь окупается впоследствии.
Вот лично мне твой SPARK не интересен, я даже не знаю что это такое, как есть и чем закусывать.
Открываешь regedit, делаешь поиск по "ключевым словам", вангуешь и мухлюешь. Это не в обиду, это очень хороший совет, не обессудь.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582366
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256kДмитрий77пропущено...

Не спорю. Идей ему достаточно подкинули.

Вроде и достаточно, а по сути - топчемся на месте.

В реестре значение ключа для анинстолла -

"или там будет msiexec.exe {GUID}"

П-ц.
WMI может быть не активен в общем случае.
Где-то есть в реестре путь, думалось, что есть какое-то известное место, а получается "как всегда"
MsiGetProductInfo
https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa370130(v=vs.85).aspx
На вход дать гуид поиска программы. Тот же что в реестре.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582367
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123MsiGetProductInfoу меня в скрипте работает.
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582372
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77256k,
Ну, а что ты хотел?
Я вот например знаю куда моя программа чего пишет. И конечно найду ее, куда б юзер ее не засунул.
Еще я напр. знаю куда WinMail (вистовский) чего пишет, что уже не тривиально, поэтому я его юзаю на последнем Win10 в том числе, и плевать что MS его "убил" еще в семерке, не предоставив людям нормальной альтернативы.
Вот и ты должен потратить драгоценное свое время, чтоб выяснить куда чего пишет то что нужно конкретно тебе.
Оно поверь окупается впоследствии.
Вот лично мне твой SPARK не интересен, я даже не знаю что это такое, как есть и чем закусывать.
Открываешь regedit, делаешь поиск по "ключевым словам", вангуешь и мухлюешь. Это не в обиду, это очень хороший совет, не обессудь.

проверил вариант через WMI - та же фигня, он выворачивает по сути ту же ветку реестра, и InstallLocation пустой тоже
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582378
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256kпроверил вариант через WMI - та же фигня, он выворачивает по сути ту же ветку реестра,
Во-во. О чем и я пытался сказать несколькими постами выше, намекая о том что чтение реестра в лоб эффективнее WMI (при отсутствии нормальных API, которые впрочем тоже туда же лезут, но "по классической науке" и без "песочных часиков").
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582403
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256kпроверил вариант через WMI -во первых код давай.
Во вторых, у меня работает, значит что то делаю не так)
...
Рейтинг: 0 / 0
Как определить установлен ли продукт?
    #39582690
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123256kпроверил вариант через WMI -во первых код давай.
Во вторых, у меня работает, значит что то делаю не так)

В перечислении пропертей есть InstallLocation, но там пусто, как, собственно и в реестре.
Пошел в реестр, пальцами написал в ключ
InstallLocation: fignya

Но эта функция все равно дает пусто


private bool isInstalled(string name)
{
ManagementObjectSearcher p = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
foreach (ManagementObject program in p.Get())
{
if (program != null && program.GetPropertyValue("Name") != null && program.GetPropertyValue("Name").ToString().Contains(name))
{
Console.WriteLine(@"FOUND: {0}", name);

foreach(var item in program.Properties)
{
Console.WriteLine(@"---: {0}, {1}", item.Name, item.Value);
}
return true;
}
}
return false;
}
...
Рейтинг: 0 / 0
25 сообщений из 48, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как определить установлен ли продукт?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]