Architecture Net


         

Простой запрос разрешения кодом


В примере SimplePermissionCodeRequest вначале запрашивается разрешение на доступ к файлу. Если в ответ на этот запрос общеязыковая среда выполнения CLR разрешения не дает, то внутри конструктора файлов она запускает исключение SecurityException. Впрочем, сперва код сам проверяет, есть ли у него это разрешение. Если разрешения у кода нет, то он и не пытается получить доступ к файлу, а просто возвращает управление вызвавшей его программе.
Обычно такое действие является излишним, потому что общеязыковая среда выполнения CLR будет предъявлять свое требование внутри конструктора, но часто вам бывает нужно проверить разрешения перед выполнением некоторого кода, чтобы выяснить, имеете ли вы необходимые права.
Класс FilelOPermission моделирует разрешения (на доступ к файлам) общеязыковой среды выполнения CLR. Его конструктору должен быть предоставлен полный путь, и для получения полного пути мы используем класс Path (Путь), о котором говорилось в главе 8 "Классы каркаса NET Framework". Мы просим доступ к файлу на чтение, запись и добавление в конец (append). Другими возможными правами доступа являются NoAccess или PathDiscovery. Последнее требуется для доступа к информации о самом пути к файлу. Вы, возможно, хотите разрешить доступ к файлу, но при этом скрыть определенную информацию, такую, например, как структура каталогов или имена пользователей в пути.
В результате выдачи запроса проверяется, есть ли у вас требуемое разрешение. Метод Demand (Требование) проверяет, имеют ли это разрешение все вызывающие программы в стеке. Другими словами, нам надо убедиться, что это право имеется не только у сборки с выполняющимся кодом, но также у всех сборок, вызвавших этот код. Если исключение генерируется, то затребованного права нет, и нам придется завершить выполнение программы.

static int Main() {
String *filename = ".\\read.txt"; // Строка
String *fileWithFullPath = // Строка
Path::GetFullPath(filename); // имя файла
try
{
FilelOPermission *fileIOPerm =
new FilelOPermission(
FilelOPermissionAccess::AllAccess, fileWithFullPath); fileIOPerm->Demand(); // Запрос }
catch(Exception *e) // Исключение {
Console::WriteLine(e->Message); // Сообщение return 1; } try
{
Filelnfo *file = new Filelnfo(filename); // имя файла
StreamReader *sr = file->OpenText(); // файл
String *text; // Строка
text = sr->ReadLine();
while (text != 0)
// пока (текст! = 0)
{
Console::WriteLine(text); // текст text = sr->ReadLine(); // текст
}
sr->Close(); }
catch(Exception *e) // Исключение {
Console::WriteLine(e->Message); // Сообщение }
return 0; }



Содержание  Назад  Вперед