Гайд Поиск директории любого приложения

Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Знакомый попросил помочь ему с поиском директории стима для его установщика на C#. Получилось не совсем, что он хотел, но код интересный, поэтому решил с вами им поделиться. Программа пробегается по основным ветвям реестра и ищет в Uninstall программу с нужным вам именем. Если вы сможете получить доступ ко всей ветви LocalMachine, то сможете искать установленные приложения и на других дисках, прошу поделиться этим кодом, если у вас получится.
В случае отсутствия ключа с необходимым DisplayName, метод GetApplictionInstallPath вернет "Не найдено".

Исходный код:
C#:
using System;
using Microsoft.Win32;

namespace Finder
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(GetApplictionInstallPath(Console.ReadLine()));
            Console.ReadKey();
        }

        public static string GetApplictionInstallPath(string nameOfAppToFind)
        {
            RegistryKey registryKey;
            string keyName, install = null, uninstall = null;

            keyName = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
            registryKey = ExistsInSubKey(Registry.CurrentUser, keyName, "DisplayName", nameOfAppToFind);
            if (registryKey != null)
            {
                try
                {
                    install = registryKey.GetValue("InstallLocation") as string;
                    uninstall = registryKey.GetValue("UninstallString") as string;
                }
                catch { }

                if (!String.IsNullOrEmpty(install))
                    return install;
                else if (!String.IsNullOrEmpty(uninstall))
                    return uninstall;
            }

            keyName = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
            registryKey = ExistsInSubKey(Registry.LocalMachine, keyName, "DisplayName", nameOfAppToFind);
            if (registryKey != null)
            {
                try
                {
                    install = registryKey.GetValue("InstallLocation") as string;
                    uninstall = registryKey.GetValue("UninstallString") as string;
                }
                catch { }

                if (!String.IsNullOrEmpty(install))
                    return install;
                else if (!String.IsNullOrEmpty(uninstall))
                    return uninstall;
            }

            keyName = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
            registryKey = ExistsInSubKey(Registry.LocalMachine, keyName, "DisplayName", nameOfAppToFind);
            if (registryKey != null)
            {
                try
                {
                    install = registryKey.GetValue("InstallLocation") as string;
                    uninstall = registryKey.GetValue("UninstallString") as string;
                }
                catch { }

                if (!String.IsNullOrEmpty(install))
                    return install;
                else if (!String.IsNullOrEmpty(uninstall))
                    return uninstall;
            }

            return "Не найдено";
        }

        private static RegistryKey ExistsInSubKey(RegistryKey root, string subKeyName, string attributeName, string nameOfAppToFind)
        {
            RegistryKey subkey;
            string displayName;

            RegistryKey key = root.OpenSubKey(subKeyName);
            if (key != null)
            {
                foreach (string kn in key.GetSubKeyNames())
                {
                    subkey = key.OpenSubKey(kn);
                    displayName = subkey.GetValue(attributeName) as string;
                    if (nameOfAppToFind.Equals(displayName))
                        return subkey;
                }
            }
            return null;
        }
    }
}
Код был взят из свободного доступа и немного переработан под наличие ключа UninstallString.
 
По вопросам рекламы/сотрудничества: @kissme_milash
Забаненный
Статус
Оффлайн
Регистрация
19 Май 2019
Сообщения
174
Реакции[?]
34
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Этот человек это бог c# Вы знали?
 
Пользователь
Статус
Оффлайн
Регистрация
1 Апр 2020
Сообщения
91
Реакции[?]
105
Поинты[?]
0
Знакомый попросил помочь ему с поиском директории стима для его установщика на C#. Получилось не совсем, что он хотел, но код интересный, поэтому решил с вами им поделиться. Программа пробегается по основным ветвям реестра и ищет в Uninstall программу с нужным вам именем. Если вы сможете получить доступ ко всей ветви LocalMachine, то сможете искать установленные приложения и на других дисках, прошу поделиться этим кодом, если у вас получится.
В случае отсутствия ключа с необходимым DisplayName, метод GetApplictionInstallPath вернет "Не найдено".

Исходный код:
C#:
using System;
using Microsoft.Win32;

namespace Finder
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(GetApplictionInstallPath(Console.ReadLine()));
            Console.ReadKey();
        }

        public static string GetApplictionInstallPath(string nameOfAppToFind)
        {
            RegistryKey registryKey;
            string keyName, install = null, uninstall = null;

            keyName = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
            registryKey = ExistsInSubKey(Registry.CurrentUser, keyName, "DisplayName", nameOfAppToFind);
            if (registryKey != null)
            {
                try
                {
                    install = registryKey.GetValue("InstallLocation") as string;
                    uninstall = registryKey.GetValue("UninstallString") as string;
                }
                catch { }

                if (!String.IsNullOrEmpty(install))
                    return install;
                else if (!String.IsNullOrEmpty(uninstall))
                    return uninstall;
            }

            keyName = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
            registryKey = ExistsInSubKey(Registry.LocalMachine, keyName, "DisplayName", nameOfAppToFind);
            if (registryKey != null)
            {
                try
                {
                    install = registryKey.GetValue("InstallLocation") as string;
                    uninstall = registryKey.GetValue("UninstallString") as string;
                }
                catch { }

                if (!String.IsNullOrEmpty(install))
                    return install;
                else if (!String.IsNullOrEmpty(uninstall))
                    return uninstall;
            }

            keyName = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
            registryKey = ExistsInSubKey(Registry.LocalMachine, keyName, "DisplayName", nameOfAppToFind);
            if (registryKey != null)
            {
                try
                {
                    install = registryKey.GetValue("InstallLocation") as string;
                    uninstall = registryKey.GetValue("UninstallString") as string;
                }
                catch { }

                if (!String.IsNullOrEmpty(install))
                    return install;
                else if (!String.IsNullOrEmpty(uninstall))
                    return uninstall;
            }

            return "Не найдено";
        }

        private static RegistryKey ExistsInSubKey(RegistryKey root, string subKeyName, string attributeName, string nameOfAppToFind)
        {
            RegistryKey subkey;
            string displayName;

            RegistryKey key = root.OpenSubKey(subKeyName);
            if (key != null)
            {
                foreach (string kn in key.GetSubKeyNames())
                {
                    subkey = key.OpenSubKey(kn);
                    displayName = subkey.GetValue(attributeName) as string;
                    if (nameOfAppToFind.Equals(displayName))
                        return subkey;
                }
            }
            return null;
        }
    }
}
Код был взят из свободного доступа и немного переработан под наличие ключа UninstallString.
Очень хороший гайд. Даже статья меня заставила подумать над улучшением кода. Порылся я в регистре и нашел, что "InstallLocation" не всегда бывает заполнен, в половине случаев он просто имеет пустое поле. Есть еще такой параметр как "InstallSource", и если "InstallLocation" пустует, то "InstallSource" всегда будет заполнен. Так же не всегда в регистре присутствует "InstallSource", тогда стоит ориентироваться только на "InstallLocation".
 
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Очень хороший гайд. Даже статья меня заставила подумать над улучшением кода. Порылся я в регистре и нашел, что "InstallLocation" не всегда бывает заполнен, в половине случаев он просто имеет пустое поле. Есть еще такой параметр как "InstallSource", и если "InstallLocation" пустует, то "InstallSource" всегда будет заполнен. Так же не всегда в регистре присутствует "InstallSource", тогда стоит ориентироваться только на "InstallLocation".
В моем коде я использовал InstallLocation и UninstallString, один из этих ключей всегда заполнен, но проблему с поиском всех приложений решить так и не удалось :(
 
Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,442
Реакции[?]
671
Поинты[?]
30K
Если у меня система на C:\, а стим на E:\ код найдет ?
 
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Если у меня система на C:\, а стим на E:\ код найдет ?
Если сможешь пофиксить нормальное получение ключей, то да (нужно для установленных приложений для всех пользователей пк)
 
Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,442
Реакции[?]
671
Поинты[?]
30K
Если сможешь пофиксить нормальное получение ключей, то да (нужно для установленных приложений для всех пользователей пк)
Конечно смогу пофиксить, я же по приколу 3 часа назад спрашивал, как в Console.ReadLine текст запихать :roflanEbalo:
 
Сверху Снизу