Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Не удаётся добавить запись в реестр


Автор: Compositum 13.2.2010, 12:46
Windows 7 Rus x64, Работаю под обычным юзером (т.е. не админ). Visual Studio 2010.

Под пользователем, не обладающим правами администратора пытаюсь програмно добавить запись в реестр в ветку HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R17.2\ACAD-7001:409\Applications. Если это же действие делать через regedit вручную - то добавляется без проблем (т.е. права на изменение данной ветви имеются), а если программно - не получается. В MSDN читал http://msdn.microsoft.com/ru-ru/library/h5e7chcf.aspx - вроде делаю всё по аналогии...
В комментарии пометил строку, где получаю ошибку.
Код:
Код

        /// <summary>
        /// Регистрация в реестре .Net-плагина, для его последующей автоматической загрузки в
        /// версии AutoCAD, которой соответствует данная ветвь реестра.
        /// </summary>
        /// <param name="acadVersion">Ветка реестра искомой версии AutoCAD</param>
        /// <param name="plaginName">Наименование плагина</param>
        /// <param name="fileName">Полное имя dll-файла загружаемой .Net-библиотеки</param>
        public void RegisterLibrary(RegistryKey acadVersion, string plaginName, string fileName)
        {
            RegistryKey parentKey = acadVersion.OpenSubKey("Applications");
            int keyLength = (Path.Combine(parentKey.Name, plaginName)).Length;
            //Длина имени ветви в реестре не должна превышать 255 символов
            if (keyLength > 255)
            {
                //Добавляем запись в журнал регистрации ошибок...
                XElement record = new XElement("Error", new XAttribute("UniversalDateTime", DateTime.Now.ToUniversalTime().ToShortDateString() + " "
                    + DateTime.Now.ToUniversalTime().ToShortTimeString()), new XAttribute("Operation", "Вызов метода 'RegisterLibrary'"),
                    new XAttribute("ParrentKey", parentKey.Name), new XAttribute("NewSubKeyName", plaginName), new XAttribute("Description", "Общая длина имени создаваемой ветви превышает 255 символов."));
                Console.WindowWidth = 150;
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Error.WriteLine(record);
                Console.ForegroundColor = consoleForegroundColor;
                return;
            }
#if DEBUG            
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("Общая длина имени новой ветви составит {0} символов, при максимально допустимом 255.", keyLength);
            Console.ForegroundColor = consoleForegroundColor;
#endif
            if (File.Exists(fileName))
            {
                try
                {                    
                    //Ошибка вылетает в следующей строке:
                    RegistryKey key = parentKey.CreateSubKey(plaginName);//Новая ветвь, содержащая информацию о плагине

                    key.SetValue("LOADER", fileName, RegistryValueKind.String);//Указываем полное имя dll-файла, который следует автоматически загружать
                    key.SetValue("LOADCTRLS", "00000002", RegistryValueKind.DWord);//Ставим метку о том, что библиотеку следует загружать при открытии приложения
                    key.SetValue("MANAGED", "00000001", RegistryValueKind.DWord);// Ставим метку о том, что код библиотеки является управляемым  
                    key.Close();
                }
                catch (Exception ex)
                {
                    //Добавляем запись в журнал регистрации ошибок...
                    XElement record = new XElement("Exception", new XAttribute("ExceptionType", ex.GetType().ToString()), new XAttribute("UniversalDateTime", DateTime.Now.ToUniversalTime().ToShortDateString() + " " 
                        + DateTime.Now.ToUniversalTime().ToShortTimeString()), new XAttribute("Operation", "RegistryKey.CreateSubKey"),
                        new XAttribute("ParrentKey", parentKey.Name), new XAttribute("Description", "Пытаюсь добавить новый подраздел в ветвь реестра."), 
                        new XAttribute("ErrorMessage", ex.Message)); 
                    Console.WindowWidth = 150;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.Error.WriteLine(record);
                    Console.ForegroundColor = consoleForegroundColor;
                }
            }
        }


Скрин результата:

user posted image

Почему не удаётся добавить запись?

Автор: Compositum 13.2.2010, 13:15
Вопрос снят, строку
Код

RegistryKey parentKey = acadVersion.OpenSubKey("Applications");

нужно заменить на
Код

RegistryKey parentKey = acadVersion.OpenSubKey("Applications", true);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)