Редактирование реестра для пользователя без прав администратора (c#, windows 11)

Я использую следующий код для отключения диспетчера задач:

RegistryKey regKey;
string subKey = @"Software\Microsoft\Windows\CurrentVersion\Policies\System";

        
regKey = Registry.CurrentUser.CreateSubKey(subKey);
regKey.SetValue("DisableTaskMgr", 1);
regKey.Close();

Моя программа работает с правами администратора. Когда я запускаю его от пользователя, не являющегося администратором (я ввожу пароль пользователя с правами администратора, чтобы запустить его), он не работает (раздел реестра успешно создан, но диспетчер задач не отключен). Когда я запускаю его от имени администратора, он работает.

У кого-нибудь есть решение для этого?

Процесс администратора имеет реестр администратора как Registry.CurrentUser, поэтому вы редактируете реестр администратора, а не обычного пользователя. (Если бы это был реестр обычного пользователя, то у вас была бы уязвимость, связанная с инъекцией, потому что обычный пользователь мог бы делать такие вещи, как настроить автозапуск на что-то вредоносное.)

Raymond Chen 04.04.2023 05:58

Значит, нет возможности редактировать стандартный реестр из-под администратора?

Lior v 04.04.2023 12:48

Ты можешь. Вы просто не можете использовать CurrentUser для этого. Вы должны перейти к Registry.Users + пользователь, чей реестр вы хотите отредактировать.

Raymond Chen 04.04.2023 15:21

Отвечает ли это на ваш вопрос? Редактировать раздел реестра другого пользователя

Charlieface 09.04.2023 14:16

Я пытался отредактировать реестр текущего пользователя (моя программа работает от имени администратора), а связанный с вами вопрос касается редактирования реестра другого пользователя.

Lior v 09.04.2023 14:44

Есть два пользователя. Исходный пользователь, запросивший повышение прав. И администратор, который в конечном итоге запускает программу. Поскольку вы хотите отредактировать исходный реестр пользователя из программы пользователя-администратора, это считается редактированием раздела реестра другого пользователя. Другой пользователь является первоначальным пользователем.

Raymond Chen 09.04.2023 15:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил проблему благодаря комментарию @RaymondChen.

ManagementObjectSearcher searcher = new ManagementObjectSearcher(
            "SELECT UserName FROM Win32_ComputerSystem");

        ManagementObjectCollection collection = searcher.Get();
        string username = (string)collection.Cast<ManagementBaseObject>().First()["UserName"];
        NTAccount account = new NTAccount(username);
        SecurityIdentifier securityIdentifier = (SecurityIdentifier)account.Translate(typeof(SecurityIdentifier));
        string sid = securityIdentifier.ToString();

        string subKey = $@"{sid}\Software\Microsoft\Windows\CurrentVersion\Policies\System";

        RegistryKey regKey = Registry.Users.CreateSubKey(subKey);
        regKey.SetValue("DisableTaskMgr", 1);
        regKey.Close();

«В сеансе служб терминалов UserName возвращает имя пользователя, вошедшего в консоль, а не пользователя, вошедшего в систему во время сеанса службы терминалов». Вам нужен пользователь, вошедший в сеанс. Также обратите внимание, что поддерживаемый способ отключения диспетчера задач — через групповую политику, а не путем редактирования реестра.

Raymond Chen 09.04.2023 15:50

Другие вопросы по теме