Как работает RegistryPermission? - PullRequest
1 голос
/ 31 августа 2009

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

код санирован для ясности

public bool CanWrite()
{
    string key = @"HKEY_LOCAL_MACHINE\SOFTWARE\MyHaccpPlan, Inc.\2.0";

    try
    {
        RegistryPermission permission = new RegistryPermission(RegistryPermissionAccess.Write, key);
        permission.Demand();
        return true;
    }
    catch(SecurityException)
    {
        return false;
    }
}

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

Позже звонок типа

Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\MyHaccpPlan, Inc.\2.0", "Language", "fr-CA");

потерпит неудачу с UnauthorizedAccessException.

Как правильно проверить права реестра перед попыткой записи в него?

Редактировать

Я не хочу, чтобы текущий пользователь мог писать там. Я хочу использовать эту запись в реестре в качестве признака того, что функция в программном обеспечении должна быть отключена. Но если пользователь является администратором, я хочу, чтобы программное обеспечение разрешило эту функцию. Цель состоит в том, чтобы сетевой администратор мог задавать настройки и пользователи не могли их изменять.

Но помимо собственно написания и ожидания его сбоя, я хочу проверить безопасность, используя систему разрешений, предлагаемую в .NET, если это возможно.

Ответы [ 2 ]

1 голос
/ 01 сентября 2009

Вы не должны полагаться на безопасность доступа к коду .NET для управления контролем доступа к реестру; не говоря уже о том, чтобы в вашем коде были явные проверки. При таком подходе пользователь все еще может использовать редактор реестра и обойти все ваши проверки доступа.

Вместо этого вы должны использовать надлежащие списки ACL, чтобы ограничить то, что пользователи могут записывать в ключ.

Если вы хотите проверить во время выполнения, есть ли у вас доступ к ключу, попробуйте открыть ключ для записи и перехватить SecurityException (в этом случае пользователь, запускающий приложение, не имеет разрешения на изменение ключа) .

0 голосов
/ 31 августа 2009

ммм, вы можете попробовать использовать такой инструмент, как Lutz Roeder's Reflector, для просмотра содержимого метода Registry.SetValue.

Глядя на это немного, кажется, это делается с помощью следующей строки кода:

new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...