Проверьте разрешение реестра без исключения - PullRequest
2 голосов
/ 16 сентября 2009

У меня есть такой код

</p> <pre><code>try { RegistryKey regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\xxxx\\yyyyy"); // more code } catch { }

Мне не нравится использование пустого блока catch. Но это полезно, потому что если у пользователя нет прав доступа к реестру, ничего не следует делать.

Этот фрагмент кода вызывается много раз, и, помимо плохой практики, я думаю, что он имеет низкую производительность.

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

RegistryPermission.Demand()

и проверьте исключение. Так что это не дает мне никакого преимущества при первоначальном подходе.

¿Есть ли способ проверить наличие разрешений на доступ к Реестру без искусственного сброса или проверки исключений?

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

Похоже, предпочтительным способом .NET является попытка получить доступ к ресурсу и проверить наличие исключений. В статье, на которую указал Янник, показано, насколько сложно справиться с моделью безопасности Windows, отыскивая нужный доступ вручную. Итак, я собираюсь немного изменить код, чтобы он проверял доступ только один раз (перехват исключений) и сохранял эту информацию, вместо того, чтобы постоянно выдавать исключения. Это имеет тот недостаток, что если пользователь изменяет параметры безопасности «на лету», код будет продолжать отказывать в доступе к реестру. Однако это предпочтительнее, если нет простого и понятного способа проверки доступа.

1 Ответ

2 голосов
/ 16 сентября 2009

Поскольку вы создаете новый ключ, разве вы не должны просто проверить разрешения родителей один раз?

Изменить: Я не уверен, есть ли управляемые пути, но вы можете попробовать CheckAccess () в Stdprov.dll: http://msdn.microsoft.com/en-us/library/aa384911%28VS.85%29.aspx

Edit2: Вы пробовали http://msdn.microsoft.com/en-us/library/1w66447a.aspx?

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

26) Проверка доступа в .NET

Во второй части мы прошли через проверка доступа с использованием Win32 AccessCheck API. К сожалению, там не похоже на эквивалент управляемая функция, которая может выполнять задача. Это не рекомендуется для вас выполнить проверку доступа в .NET. Вместо этого вы должны использовать Ролевая безопасность для выполнения проверка доступа для вас (вот что ReadSD делает. Прежде чем ReadSD пишет дескриптор безопасности, его нужно проверить если вам разрешено изменить дескриптор безопасности. Это делает это чтение дескриптора безопасности и вызов GenericPrincipal.IsInRole для проверка на членство в группе). Только это работает, если ваши объекты предназначены для Ролевая безопасность. Это не работает с объектами, охраняемыми дескрипторы.

Если вам нужно выполнить проверку доступа на объекте с обеспечением дескриптор (ключ реестра в нашем случае), вы бы не использовали AccessCheck для этого (даже в Win32). Правильный метод открыть раздел реестра, и если дескриптор безопасности запрещает доступ, вы получите «доступ запрещен» исключение.

В простых проверках доступа вы можете в состоянии выполнить проверку доступа себя с помощью императивная ролевая безопасность (рис. 38):

http://www.codeproject.com/KB/system/accessctrl3.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...