Книга: C# для профессионалов. Том II
Простой пример
Простой пример
Создадим небольшое приложение, обращающееся к локальному диску, поведение которого требует тщательного управления. Приложение относится к C# Windows Forms с окном списка и кнопкой. Если нажать на кнопку, то окно списка заполняется из файла с именем animals.txt
в корне диска C:
:
Приложение создается с помощью Visual Studio.NET, единственными изменениями в нем являются добавления к форме окна списка и кнопки Load Data, а также подключение к кнопке события, что выглядит следующим образом.
// Пример из SecurityAppl
private void button1_Click(object sender, System.EventArgs e) {
StreamReader stream = File.OpenText(@"C:animals.txt");
String str;
while ((str = stream.ReadLine()) != null) {
listBox1.Items.Add(str);
}
}
Метод открывает простой текстовый файл из корня диска C:
, который содержит список животных на отдельных строках, и загружает каждую строку в переменную типа string, которая затем используется для создания каждого элемента в окне списка.
Если выполнить приложение на локальной машине и нажать кнопку, то мы увидим загруженные из корня диска C:
данные, выведенные в окне списка, как и ожидалось. Неявно среда выполнения предоставила сборке полномочие, которое необходимо для выполнения, доступа к интерфейсу пользователя и чтения данных с локального диска:
Вспомним, что полномочия группы кода в зоне интранет являются более строгими, чем на локальной машине, в частности, они не разрешают доступ к локальному диску (за исключением папки, из которой выполняется приложение). Если снова выполнить приложение, но в этот раз с общего сетевого диска, оно будет выполняться так же, как и раньше, поскольку ему предоставлены полномочия для выполнения и доступа к интерфейсу пользователя. Однако, если теперь нажать кнопку Load Data на форме, будет порождаться исключение безопасности:
В тексте сообщения исключения упоминается объект System.Security.Permissions.FileIOPermission
. Он является полномочием, не предоставленным приложению и запрошенным классом из Framework, который используется для загрузки данных из файла на локальном диске.
По умолчанию группе кода Intranet предоставляется множество полномочий LocalIntranet
. Изменим с помощью следующей команды это множество полномочий на FullTrust
, чтобы любой код из зоны интранет мог выполняться полностью без ограничений.
caspol.exe -chggroup 1.2 FullTrust
Если теперь снова выполнить приложение с общего сетевого диска и нажать на кнопку, мы увидим, что окно списка заполняется из файла в корне диска C:
и исключения не возникают.
В подобных сценариях, где используются ресурсы, управляемые полномочиями, рекомендуется расширять код, чтобы исключения безопасности перехватывались и приложение могло постепенно уменьшать свою деятельность. Например, в данном приложении можно добавить блок try-catch вокруг кода доступа к файлу и, если порождается исключение SecurityException
, то в окне списка выводится строка "Permission denied accessing file" ("Полномочия не разрешают доступ к файлу"):
// Код из SecurityАрр1
private void button1_Click(object sender, System.EventArgs e) {
try {
StreamReader din = File.OpenText(@"C:animals.txt");
String str;
while((str = din.ReadLine() != null) {
listBox1.Items.Add(str);
}
} catch (SecurityException exception) {
listBox1.Items.Add("Permission denied accessing file");
}
}
В действительности, если необходимо выполнить определенное приложение с общего сетевого диска, то скорее всего будет выбрано решение, которое не открывает клиентскую машину всему коду в интранет. Вместо этого будут использоваться группы кода и условия членства для строгого контроля требования приложения с учетом его расположения в интранет, строгого имени или сертификата, подтверждающего идентичность издателя.
- СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- 1.2.5. Пример программы
- 19.5.1. Простой пример
- Комментарии к примеру простой системы "производитель
- Пример 25-1. Простой массив
- Простой пример использования сигнала SIGURG
- Простой пример использования функции select
- Простой пример, иллюстрирующий применение модели XML DOM и однонаправленного чтения-записи XML-документов
- Простой пример с текстом
- Листинг 14.1. Простой пример создания и использования объекта ADO.NET DataSet
- 5.3.1. Учебный пример: SMTP, простой протокол передачи почты