Как программно передать право владения ключом реестра администраторам?

c# .net windows permissions registry

1881 просмотра

1 ответ

Я столкнулся со странной проблемой, когда обновил некоторые машины до Windows 10, где неправильные разрешения на RuntimeBroker вызывали проблемы. В Интернете я нашел решение, которое рекомендовало изменить разрешения (сначала в реестре, затем в конфигурации DCOM), и я пытаюсь написать небольшое приложение .NET для автоматизации процесса.

В настоящее время владельцем соответствующих ключей реестра является, NT SERVICE\TrustedInstallerи я пытаюсь изменить его COMPUTER\Administrators. У меня есть простое приложение WPF с установленным параметром requiredExecutionLevel со значением «requireAdministrator», но я все еще сталкиваюсь с проблемами. Вот фрагмент кода для иллюстрации проблемы:

using System.Security.AccessControl;
using System.Security.Principal;
using Microsoft.Win32;

namespace PermissionFixer
{
    public class Fixer
    {
        public void Fix()
        {
            var subKey = Registry.ClassesRoot.OpenSubKey(@"AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}", true);
            if (subKey != null)
            {
                var admins = new NTAccount("Administrators");
                var ac = subKey.GetAccessControl();
                ac.SetOwner(admins);
                ac.AddAccessRule(new RegistryAccessRule(admins, RegistryRights.FullControl, AccessControlType.Allow));
                subKey.SetAccessControl(ac);
            }
        }
    }
}

Проблема в том, что он даже не проходит вызов до того, OpenSubKey()как нажать SecurityException«Запрашиваемый доступ к реестру не разрешен». Я думаю, это потому, что администраторы еще не имеют доступа (помните, что он принадлежит TrustedInstaller), но это становится проблемой курицы и яйца. Странно то, что когда я использую regeditруку я имею разрешено изменить владелец Администратор, и я уверен , что мой экземпляр смерзаться работают с правами администратора.

Как я могу заставить это работать в .NET?

Автор: soapergem Источник Размещён: 06.11.2019 05:23

Ответы (1)


3 плюса

Решение

Я понял это, и, к счастью, этого можно добиться с помощью классов .NET. Вот как вы должны вызвать OpenSubKey:

var subKey = Registry.ClassesRoot.OpenSubKey(@"AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.TakeOwnership);

Затем вы должны прекратить вызов AddAccessRule()... вы не можете изменить его, пока не станете владельцем; и вы должны сделать эти две операции последовательно. Поэтому сначала возьмите на себя ответственность, а затем снова откройте ключ с другими правами доступа, чтобы добавить правило доступа.

РЕДАКТИРОВАТЬ: Я обнаружил сегодня, что вы должны сначала манипулировать токеном, с которым работает ваше приложение, подключаясь к вызовам P / Invoke. Я нашел класс с именем TokenManipulator, на который ссылается другой вопрос переполнения стека . Включите этот класс в свой проект, а затем перед вызовом предоставьте свои токены привилегии Backup, Restore и TakeOwnership OpenSubKey. Таким образом, ваш метод будет выглядеть примерно так:

try
{
    TokenManipulator.AddPrivilege("SeRestorePrivilege");
    TokenManipulator.AddPrivilege("SeBackupPrivilege");
    TokenManipulator.AddPrivilege("SeTakeOwnershipPrivilege");

    var subKey = Registry.ClassesRoot.OpenSubKey(@"AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.TakeOwnership);
    // code to change owner...
}
finally
{
    TokenManipulator.RemovePrivilege("SeRestorePrivilege");
    TokenManipulator.RemovePrivilege("SeBackupPrivilege");
    TokenManipulator.RemovePrivilege("SeTakeOwnershipPrivilege");
}
Автор: soapergem Размещён: 02.08.2016 05:56
Вопросы из категории :
32x32