none
Как установить права работы с реестром в программе C# VS2010 RRS feed

  • Вопрос

  • На ПК работаю с учетной записью типа Администратор. Однако в программе
      class Program
      {
        static string strName1;
        static void showKeyTree(RegistryKey rkey)
        {
          RegistryKey subKey = null;
          try
          {
            foreach(string strName in rkey.GetSubKeyNames())
            {
              strName1 = strName;
              Console.Write("{0}", strName);
              try
              {
                subKey = rkey.OpenSubKey(strName, RegistryKeyPermissionCheck.ReadSubTree);
                if (subKey == null)
                {
                   return;
                }
                Console.Write(" - [OK]");
              }
              catch (System.Exception ex)
              {
                Console.Write(" - [Error] {0}", ex.Message);
              }
              Console.WriteLine();
              showKeyTree(subKey);
              subKey.Close();
    
            } // foreach
          } // try 1
          catch (System.Exception ex)
          {
            Console.WriteLine("{0} - [Error] {1}", strName1, ex.Message);
          }
        } // showKeyTree
     возникает очень много ошибок доступа к реестру. Подскажите, пожалуйста, как сделать так, чтобы программа имела возможность перебирать ветви реестра без ошибок. UAC деактивирован.

    Alex


    • Изменено tumanovalex 20 июня 2012 г. 6:47
    20 июня 2012 г. 6:45

Ответы

  • Права нужно пробовать устанавливать либо на саму ветку, либо на родительску и так далее выше идти. Можно попробовать с помощью функции RegistryKey.SetAccessControl

    Но для ее работы ваша программа от имени администратора должна быть запущена


    Для связи [mail]

    • Помечено в качестве ответа LXGDARKEditor 6 июля 2012 г. 5:23
    29 июня 2012 г. 7:48

Все ответы

  • Какие именно возникают ошибки, можете привести несколько из них. Помоему для чтения реестра не нужны особые права, если можете - попробуйте запустить от администратора exe.

    Также какой разрядности у вас система, если x64, то может вы пытаетесь получить доступ к x86 ветке и ее не находит по заданному ключу?


    Для связи [mail]

    21 июня 2012 г. 7:27
  • К сожалению, до сих пор на форуме нет возможности прикрепить программу, направил ее Вам по почте. Надеюсь на Вашу помощь. У меня Windows 7 начальная 32 бит.

    Alex


    • Изменено tumanovalex 21 июня 2012 г. 17:38
    21 июня 2012 г. 17:37
  • Привет, ваша программа получает доступ ко всем доступным записям, к тем что не может получить - не может получить и Администратор компьютера пока не будет владеть веткой реестра (можете попробовать сами попробовать открыть недоступную программе ветку в Regedit).


    Для связи [mail]

    22 июня 2012 г. 10:12
  • Я попробовал, ветки Properties действительно не открываются. И программно нет возможности их открыть? Например, если дает ошибку, то установить владение и все-таки открыть. Получается, что поиск в некоторых ветвях нельзя провести? 

    Alex

    22 июня 2012 г. 14:58
  • Права нужно пробовать устанавливать либо на саму ветку, либо на родительску и так далее выше идти. Можно попробовать с помощью функции RegistryKey.SetAccessControl

    Но для ее работы ваша программа от имени администратора должна быть запущена


    Для связи [mail]

    • Помечено в качестве ответа LXGDARKEditor 6 июля 2012 г. 5:23
    29 июня 2012 г. 7:48
  • Спасибо, попробую.

    Alex

    29 июня 2012 г. 17:47
  • Спасибо, попробую.

    Alex

    Пожалуйста не забудьте написать результат и если у вас все получится, пометить соответствующее сообщение как ответ.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    29 июня 2012 г. 17:55
    Отвечающий
  • Обязательно напишу и помечу.


    Alex

    30 июня 2012 г. 8:04
  • Посмотрел разрешения на ветку SYSTEM\\CurrentControlSet\\Enum\\USB. Есть полный доступ адмиристраторов на System, CurrentControlSet, а вот для Enum и USB в перечне пользователей, у которых есть разрешения, администраторы отсуствуют. Попробовал сделать так:

         RegistryKey hklm = Registry.LocalMachine;
          string user = Environment.UserDomainName + "\\" + Environment.UserName;
          RegistrySecurity rsusbold = new RegistrySecurity();
          RegistrySecurity rsusbnew = new RegistrySecurity();
          rsusbnew.AddAccessRule(new RegistryAccessRule(user,
                              RegistryRights.FullControl,
                              InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
                              PropagationFlags.InheritOnly,
                              AccessControlType.Allow));
          RegistryKey hkusb = hklm.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum\\USB", RegistryKeyPermissionCheck.ReadSubTree);
          rsusbold = hkusb.GetAccessControl();
          hkusb.SetAccessControl(rsusbnew);
          hkusb.SetAccessControl(rsusbold); 

    на hkusb.SetAccessControl(rsusbnew) возникает исключение. Хотя я имею права администратора, добавить вручную администраторов в перечень пользователей, у которых есть разрешения для работы с Enum и USB, не удается (Отказано в доступе). Подскажите, пожалуйста,
    как все-таки можно получить права для чтения и записи в моем случае.  Проект разместил на http://zalil.ru/33576282


    Alex


    • Изменено tumanovalex 16 июля 2012 г. 12:37
    16 июля 2012 г. 12:28