Поделиться через


Разрешение вопросов, связанных с исключениями управления доступом для кода

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

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

Запрос разрешений гарантирует, что код будет выполнен, если политика безопасности на локальном компьютере это позволяет. Если запрос необходимых разрешений не сделан, увеличивается риск того, что код не сможет выполняться. Дополнительные сведения о разрешениях доступа для кода и о запросах на эти разрешения содержатся в разделах Разрешения для доступа к коду и Запрос разрешений. Дополнительные сведения о блоках Try...Catch см. в разделе Оператор Try... Catch... Finally (Visual Basic).

В случае необходимости для приложений ClickOnce можно запросить дополнительные разрешения на странице "Безопасность" в конструкторе приложений. Дополнительные сведения см. в разделе Практическое руководство. Установка пользовательских разрешений для ClickOnce-приложения.

Возможные причины возникновения исключений управления доступом для кода:

  • Буфер обмена. Возможности программной вставки из буфера обмена для управляемого кода ограничены, поскольку буфер обмена может содержать важные сведения.

  • Доступ к реестру или к файловой системе. Доступ к локальной файловой системе ограничен. При обращении к файлу или ресурсу, развертываемому в составе сборки, используйте для получения пути к сборке код Assembly.GetExecutingAssembly.Location.

  • Доступ по сети. Следует удостовериться, что сборка использует тот же протокол, с которым она была загружена. Вообще говоря, доступ по сети разрешен только к URL-адресу, который был источником сборки.

  • Печать. Печать из программного обеспечения, запущенного в зоне "Интернет", возможна только с использованием стандартного диалогового окна печати. Если в приложении используется стандартное диалоговое окно для выбора принтера, в этом окне можно выбрать только принтер по умолчанию.

  • Сериализация. Возможность восстановить объект из произвольных данных есть только у кода, выполняемого с полным доверием. При XML-сериализации в коде с частичным доверием должна присутствовать техническая возможность использования типа XmlSerializer. Дополнительные сведения о типе XmlSerializer см. в разделе Класс XmlSerializer.

  • Отражение. Доступ ко многим функциям среды выполнения, связанным с отражением, для кода с частичным доверием ограничен.

Проверка кода на возникновение исключений управления доступом для кода

Для блоков кода, которые могут вызвать исключение CodeAccessSecurityException, используйте блок Try...Catch, чтобы код можно было выполнить, если это возможно, а в противном случае происходила бы соответствующая обработка.

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

Для проверки наличия разрешений можно создать экземпляр класса, производного от класса CodeAccessPermission, например FileIOPermission. Затем для проверки наличия разрешений из блока Try...Catch можно вызвать метод Demand. Возникновение исключения будет означать, что приложение не имеет необходимого разрешения.

В следующем примере проверка того, имеет ли сборка разрешение EventLogPermission, производится путем вызова или создания EventLogPermission и выполнения его метода Demand в блоке Try...Catch с целью определения, будет ли метод Demand выполнен успешно.

Try
    Dim MyPermission As New EventLogPermission
    MyPermission.Demand()
    MsgBox(MyPermission.ToString())
Catch ex As Exception
    MsgBox("Assembly lacks EventLogPermission.")
End Try

См. также

Основные понятия

Разрешения для доступа к коду

Запрос разрешений

Основы управления доступом для кода