Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

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

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

Исходный код:
C#:
Expand Collapse Copy
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.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Этот человек это бог c# Вы знали?
 
Знакомый попросил помочь ему с поиском директории стима для его установщика на C#. Получилось не совсем, что он хотел, но код интересный, поэтому решил с вами им поделиться. Программа пробегается по основным ветвям реестра и ищет в Uninstall программу с нужным вам именем. Если вы сможете получить доступ ко всей ветви LocalMachine, то сможете искать установленные приложения и на других дисках, прошу поделиться этим кодом, если у вас получится.
В случае отсутствия ключа с необходимым DisplayName, метод GetApplictionInstallPath вернет "Не найдено".

Исходный код:
C#:
Expand Collapse Copy
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".
 
Очень хороший гайд. Даже статья меня заставила подумать над улучшением кода. Порылся я в регистре и нашел, что "InstallLocation" не всегда бывает заполнен, в половине случаев он просто имеет пустое поле. Есть еще такой параметр как "InstallSource", и если "InstallLocation" пустует, то "InstallSource" всегда будет заполнен. Так же не всегда в регистре присутствует "InstallSource", тогда стоит ориентироваться только на "InstallLocation".
В моем коде я использовал InstallLocation и UninstallString, один из этих ключей всегда заполнен, но проблему с поиском всех приложений решить так и не удалось :(
 
Если у меня система на C:\, а стим на E:\ код найдет ?
Если сможешь пофиксить нормальное получение ключей, то да (нужно для установленных приложений для всех пользователей пк)
 
Если сможешь пофиксить нормальное получение ключей, то да (нужно для установленных приложений для всех пользователей пк)
Конечно смогу пофиксить, я же по приколу 3 часа назад спрашивал, как в Console.ReadLine текст запихать :roflanEbalo:
 
Назад
Сверху Снизу