Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432

Смена владельца ветки реестра

03.09.2024, 09:01. Показов 7325. Ответов 148

Студворк — интернет-сервис помощи студентам
Всем привет, подскажите пожалуйста с примером
Нужно получить права доступа к системной ветки реестра то есть, если ветка принадлежит к разделу СИСТЕМА как можно изменить владельца на Администраторы и после выполнения каких-либо действий вернуть владельца обратно

И возможно ли это вообще? Т.к я много искал и читал, но так и не нашел
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.09.2024, 09:01
Ответы с готовыми решениями:

Удаление ветки реестра
Хочу сделать некое подобие твикера для винды, реализовываю твик убирающий папки из проводника, для этого нужно удалить вот этот раздел в...

Поиск раздела (ветки) реестра
Подскажите, подправьте код. Задача - искать в реестре раздел (ветку). Существует или нет. Код //Поиск ветки (раздела) в...

Проверка нужной ветки реестра
Здравствуйте, подскажите пожалуйста, как можно сделать проверку на нужную ветку в реестре. Пример:...

148
228 / 169 / 71
Регистрация: 14.06.2024
Сообщений: 458
03.09.2024, 09:08
возможно тут поможет:
Запуск приложения от имени администратора
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
03.09.2024, 09:10  [ТС]
udmurt2024, читайте внимательно вопрос. Вы скинули ссылку на запуск от админа
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
03.09.2024, 10:13
pafka1997, по идее нужно использовать методы RegistryKey.GetAccessControl, RegistryKey.SetAccessControl.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
03.09.2024, 13:13  [ТС]
OwenGlendower, я как дома буду напишу пример и скину сюда, просто я уже пробовал так писать и выдавало исключение

Добавлено через 2 часа 57 минут
OwenGlendower, я запрашиваю разрешение на доступ, но мне выдает исключение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string user = Environment.UserDomainName + "\\" + Environment.UserName;
 
RegistrySecurity rs = new RegistrySecurity();
 
// Allow the current user to read and delete the key.
//
rs.AddAccessRule(new RegistryAccessRule(user,
    RegistryRights.TakeOwnership | RegistryRights.FullControl,
    InheritanceFlags.ContainerInherit,
    PropagationFlags.NoPropagateInherit,
    AccessControlType.Allow));
 
 
RegistryKey hklm = Registry.LocalMachine;
 
           
RegistryKey hkusb = hklm.OpenSubKey("SECURITY", RegistryKeyPermissionCheck.ReadSubTree);
System.Security.SecurityException: "Запрошенный доступ к реестру запрещен."
0
sleep
 Аватар для I can
4914 / 4553 / 837
Регистрация: 13.04.2015
Сообщений: 9,677
03.09.2024, 13:17
Цитата Сообщение от pafka1997 Посмотреть сообщение
"Запрошенный доступ к реестру запрещен."
ЕМНИП, студию тоже от админа надо запускать.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
03.09.2024, 13:44
Цитата Сообщение от pafka1997 Посмотреть сообщение
я запрашиваю разрешение на доступ, но мне выдает исключение
Насколько я вижу полные права на ветку SECURITY есть только у Системы. Для администраторов стоят права Write DAC и Read Control. Думаю что в дополнение к запуску с правами администратора вам необходимо сначала поставить правильные права на эту ветку, а только потом открывать ее с RegistryKeyPermissionCheck.ReadSubTree.

Добавлено через 56 секунд
Зачем, кстати, вам понадобился доступ к этой ветке? Может как-то по другому задачу можно решить.

Добавлено через 17 минут
Вот так ключ можно открыть
C#
1
2
3
4
5
6
RegistryKey hklm = Registry.LocalMachine;
using RegistryKey keySecurity = hklm.OpenSubKey(
    "SECURITY",
    RegistryKeyPermissionCheck.Default,
    RegistryRights.ChangePermissions);
var accessControl = keySecurity.GetAccessControl();
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
03.09.2024, 14:29  [ТС]
OwenGlendower, Да, вроде открывает и без проблем но к примеру записать в ключ по умолчанию ничего не дает.
Как правильно можно записать с полученными правами в ключ? Не важно в какой просто как пример

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Зачем, кстати, вам понадобился доступ к этой ветке? Может как-то по другому задачу можно решить.
Мне не нужен доступ к ней, я просто хочу в ближайшее время начать работать с реестром и понять как работать с правами и т.д, как к примеру временно получать права на редактирование какой-нибудь системной ветки реестра или стать владельцем, а после чего вернуть все на свои места. В общем и целом ждет меня в ближайшее время нерва-трепка т.к примеров вроде куча, но они все одинаковые, либо же не работают
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
03.09.2024, 15:17
Цитата Сообщение от pafka1997 Посмотреть сообщение
Да, вроде открывает и без проблем но к примеру записать в ключ по умолчанию ничего не дает.
Так и не должен. Я же показал код для первого шага где мы готовимся сменить права. Далее нужно сменить владельца и/или права, закрыть ключ и открыть его по новой.

Цитата Сообщение от pafka1997 Посмотреть сообщение
Мне не нужен доступ к ней,
Пример другой ветки где это реально можете понадобится можете привести?

Цитата Сообщение от pafka1997 Посмотреть сообщение
В общем и целом ждет меня в ближайшее время нерва-трепка т.к примеров вроде куча, но они все одинаковые, либо же не работают
Готового рабочего примера у меня для вас нет. Если приведете пример ветки отличной от SECURITY, то попробую помочь.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
03.09.2024, 15:20  [ТС]
OwenGlendower,
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Пример другой ветки где это реально можете понадобится можете привести?
Пример ветки вот, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Services\WdBoot
Параметр Start нужно изменить на 4
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
04.09.2024, 21:47
pafka1997, пока не получилось найти решение. Остановился на таком коде, который выдает UnauthorizedAccessException при попытке установить права даже для HKCU раздела что странно:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//const string KEY = @"SYSTEM\CurrentControlSet\Services\WdBoot";
//const string KEY = @"SYSTEM\Setup";
//using (RegistryKey key = Registry.LocalMachine.OpenSubKey(KEY, RegistryRights.TakeOwnership | RegistryRights.WriteKey | RegistryRights.ChangePermissions))
 
const string KEY = @"Printers\Connections";
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(KEY, RegistryRights.TakeOwnership | RegistryRights.WriteKey | RegistryRights.ChangePermissions))
{
    Process.GetCurrentProcess().EnablePrivilege(Privilege.TakeOwnership);
    //Process.GetCurrentProcess().GetPrivilegeState(Privilege.TakeOwnership).Dump();
    
    var accessControl = key.GetAccessControl();
    var oldOwner = accessControl.GetOwner(typeof(NTAccount));
 
    string user = Environment.UserDomainName + "\\" + Environment.UserName;
    var newOwner = new NTAccount(user);
    accessControl.SetOwner(newOwner);
    key.SetAccessControl(accessControl); // UnauthorizedAccessException
    
    accessControl.SetOwner(oldOwner);
    key.SetAccessControl(accessControl);
}
В коде используется NuGet пакет ProcessPrivileges.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
04.09.2024, 21:56  [ТС]
OwenGlendower, я только что убил реестр тем самым получил синий экран, вместо определенной ветки, я изменил права на HKLM, только не понял как это произошло, суть не в этом. Завтра после работы восстановлю все и скину пример как я это сделал, может и вы подскажите где там ошибка и почему он меняет права на HKLM
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
04.09.2024, 21:58
pafka1997, с реестром нужно быть аккуратным. Обратите внимание что я в примере сначала запоминаю старого владельца, а только потом ставлю нового и в конце возвращаю старого. Как раз чтобы ничего не сломать.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
05.09.2024, 04:28  [ТС]
OwenGlendower, я обычно на виртуалке делаю, а вчера приехал с работы и лень что-то было запускать вот и решил проверить и получил результат
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
05.09.2024, 20:22  [ТС]
OwenGlendower,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
string user = Environment.UserDomainName + "\\" + Environment.UserName;
 
            RegistrySecurity rs = new RegistrySecurity();
 
 
            rs.AddAccessRule(new RegistryAccessRule(user,
                RegistryRights.ReadKey | RegistryRights.Delete,
                InheritanceFlags.None,
                PropagationFlags.None,
                AccessControlType.Allow));
 
 
            rs.AddAccessRule(new RegistryAccessRule(user,
                RegistryRights.WriteKey | RegistryRights.ChangePermissions,
                InheritanceFlags.None,
                PropagationFlags.None,
                AccessControlType.Deny));
 
 
            RegistryKey rk = Registry.LocalMachine;
            RegistryKey rk2;
 
 
            rk2 = rk.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\WdBoot", true);
            
                rs = new RegistrySecurity();
                rs.AddAccessRule(new RegistryAccessRule(user,
                    RegistryRights.WriteKey,
                    InheritanceFlags.None,
                    PropagationFlags.None,
                    AccessControlType.Allow));
                rk2 = rk.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\WdBoot", false);
                rk2.SetAccessControl(rs);
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
05.09.2024, 21:46
pafka1997, в приведенном коде нет причин для возникновения описанной вами беды. Но я легко могу представить почему это могло произойти. Код небрежный и неопрятный. Возможно вы в какой-то момент перепутали переменные rk и rk2.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
05.09.2024, 22:25  [ТС]
OwenGlendower, попробуйте протестировать на виртуалке, у меня второй раз ломает ветку HKLM

Добавлено через 27 минут
OwenGlendower, Извините, я ввел вас в заблуждение, я использовал не этот код, а вот этот. Но при этом оба кода ломают HKLM
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
string user = Environment.UserDomainName + "\\" + Environment.UserName;
 
RegistrySecurity rs = new RegistrySecurity();
 
rs.AddAccessRule(new RegistryAccessRule(user,
    RegistryRights.ReadKey | RegistryRights.Delete,
    InheritanceFlags.None,
    PropagationFlags.None,
    AccessControlType.Allow));
 
rs.AddAccessRule(new RegistryAccessRule(user,
    RegistryRights.WriteKey | RegistryRights.ChangePermissions,
    InheritanceFlags.None,
    PropagationFlags.None,
    AccessControlType.Deny));
 
RegistryKey rk = Registry.LocalMachine;
rs = new RegistrySecurity();
rs.AddAccessRule(new RegistryAccessRule(user,
    RegistryRights.WriteKey,
    InheritanceFlags.None,
    PropagationFlags.None,
    AccessControlType.Allow));
rk.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\WdBoot", true);
rk.SetAccessControl(rs);
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
05.09.2024, 22:58
Цитата Сообщение от pafka1997 Посмотреть сообщение
попробуйте протестировать на виртуалке, у меня второй раз ломает ветку HKLM
Я протестировал. Получил UnauthorizedAccessException.

Цитата Сообщение от pafka1997 Посмотреть сообщение
я ввел вас в заблуждение, я использовал не этот код, а вот этот.
Я был близок к истине когда говорил что вы "перепутали переменные rk и rk2". В строке №25 вы вызываете SetAccessControl для HKEY_LOCAL_MACHINE. Может лучше не лезть в реестр, если вы такую простую ошибку не в состоянии найти?
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 432
05.09.2024, 23:04  [ТС]
OwenGlendower, ее я нашел, и переделал все, только теперь выдает ошибку рк2 было null
C#
1
2
3
4
5
6
7
8
9
RegistryKey rk = Registry.LocalMachine;
RegistryKey rk2 = rk.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\WdBoot", true);
rs = new RegistrySecurity();
rs.AddAccessRule(new RegistryAccessRule(user,
    RegistryRights.WriteKey,
    InheritanceFlags.None,
    PropagationFlags.None,
    AccessControlType.Allow));
rk2.SetAccessControl(rs);
Пишу с телефона возможно где-нибудь ошибся
Разные пути пробовал и все равно вылет null
Буду на выходных думаю разберусь, а то после работы как-то мало соображаю
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18242 / 14156 / 5366
Регистрация: 17.03.2014
Сообщений: 28,844
Записей в блоге: 1
05.09.2024, 23:24
Цитата Сообщение от pafka1997 Посмотреть сообщение
переделал все,
Это по сути код из поста #15 только без лишних строк.

Цитата Сообщение от pafka1997 Посмотреть сообщение
теперь выдает ошибку рк2 было null
Не может быть. Вы явно какой-то другой код запускаете. У меня все еще выдает UnauthorizedAccessException. Какая у вас версия Windows? UAC включен?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.09.2024, 23:24
Помогаю со студенческими работами здесь

Как удалить содержимое ветки реестра
Всем доброго здравия. Подскажите как на C# удалить содержимое ветки реестра HKLM\SYSTEM\CurrentContolSet\Enum\USBSTOR

Мониторинг ветки реестра
Есть ветка HKEY_LOCAL_MACHINE\SOFTWARE\Task_Queue\Parameters\Task_Execution_Duration Что нужно написать, чтоб програма после запуска и до...

Права на ветки реестра
В моей программе вывода дерева для ветки реестра HKLM\\SYSTEM\\CurrentControlSet\\Enum\\USB при попытке получить подключи веток Properties...

Получение имени ветки реестра
подскажите как получить имя вложенной ветки реестра например есть есть ветка реестра HKEY_CURRENT_USER\\SOFTWARE\\Yandex\\{name} - тут...

Вывести все ветки реестра
Как вывести все ветки реестра. А также открыть вывести папки что вложены в каждую ветку? Есть метод RegistryKey.GetSubKeyNames - Ссылка на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru