Итерация через записи в реестре

20

Как предложено здесь , я необходимо перебирать записи в

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\

, чтобы узнать установленный путь к моему приложению. Как повторить так, чтобы я мог узнать InstallLocation , учитывая DisplayName . Как сделать это эффективно на C #.

    
задан Nemo 22.09.2009 в 09:39
источник
  • Имейте в виду, что для доступа к HKEY_LOCAL_MACHINE ваше приложение должно иметь права администратора (для всех ОС после XP). Интересно, должен ли вопрос «найти установленный путь для моего приложения»? Если сценарий предназначен для обновлений и т. Д., Я думаю, что общие данные приложений могут быть лучше. –  Rob Smyth 03.11.2012 в 11:25

2 ответа

28

Ниже приведен код для достижения вашей цели:

class Program
{
    static void Main(string[] args)
    {
        RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Uninstall");
        foreach (var v in key.GetSubKeyNames())
        {
            Console.WriteLine(v);

            RegistryKey productKey = key.OpenSubKey(v);
            if (productKey != null)
            {
                foreach (var value in productKey.GetValueNames())
                {
                    Console.WriteLine("\tValue:" + value);

                    // Check for the publisher to ensure it's our product
                    string keyValue = Convert.ToString(productKey.GetValue("Publisher"));
                    if (!keyValue.Equals("MyPublisherCompanyName", StringComparison.OrdinalIgnoreCase))
                        continue;

                    string productName = Convert.ToString(productKey.GetValue("DisplayName"));
                    if (!productName.Equals("MyProductName", StringComparison.OrdinalIgnoreCase))
                        return;

                    string uninstallPath = Convert.ToString(productKey.GetValue("InstallSource"));

                    // Do something with this valuable information
                }
            }
        }

        Console.ReadLine();
    }
}

Изменить: См. этот метод для более полного поиска пути установки приложений . , он демонстрирует удаление using , как указано в комментариях. Ссылка

    
ответ дан Mike J 22.09.2009 в 10:08
  • Вы можете вызвать Dispose в экземплярах RegistryKey или, еще лучше, обернуть их использованием блоков. –  Fredrik Mörk 22.09.2009 в 10:14
  • Примечание: вам нужно будет вручную передать в IDisposable, чтобы выставить его явно. –  xr280xr 18.11.2013 в 23:33
1
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Whater\The\Key"))
{
  if (key != null)
  {
    foreach (string ValueOfName in key.GetValueNames())
    {
      try
      {
         bool Value = bool.Parse((string)key.GetValue(ValueOfName));
      }
      catch (Exception ex) {}
    }
 }
}

С bool cast: D - поэтому ожидается, что строка будет True или False.

Для куста реестра пользователей используйте Registry.CurrentUser вместо Registry.LocalMachine

    
ответ дан rémy 17.05.2018 в 01:19