Практическое руководство. Запрос минимальных разрешений с помощью флага RequestMinimum

Обновлен: Ноябрь 2007

Флаг RequestMinimum позволяет запрашивать минимальный набор разрешений, необходимый для выполнения кода. И наоборот, флаг RequestRefuse позволяет отклонять разрешения, явно указывая, какие из них не должны выдаваться коду.

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

В следующем примере производится запрос FileIOPermission с помощью флага RequestMinimum. Пример не будет выполняться, если ему не будет предоставлено запрошенное разрешение. В этом примере предполагается, что в пространстве имен LogNameSpace существует гипотетический класс Log. Класс Log содержит метод MakeLog , создающий новый лог-файл на локальном компьютере. Это приложение создает новый экземпляр класса Log, после чего вызывает метод MakeLog внутри блока try. Используя зарезервированное слово catch, оно перехватывает любые созданные исключения SecurityException и отображает сообщение.

Пример

Imports System
Imports System.Security
'The hypothetical class log is in this namespace.
Imports LogNameSpace
Imports System.Security.Permissions
'The request is placed at the assembly level.
<assembly: FileIOPermission(SecurityAction.RequestMinimum, Unrestricted := True)>

Namespace MyNamespace
   Public Class MyClass1
      
      Public Sub New()

      End Sub
      
      'Entry point that delegates to C-style main Private Function.
      Public Overloads Shared Sub Main()
         Main(System.Environment.GetCommandLineArgs())
      End Sub
      
      Overloads Public Shared Sub Main(args() As String)
         'Put any code that requires optional permissions in the try block. 
         Try
            Dim MyLog As New Log()
            MyLog.MakeLog()
            Console.WriteLine("The Log has been created.")
         'Catch the security exception and inform the user that the 
         'application was not granted FileIOPermission.
         Catch
            Console.WriteLine("This application does not have permission to write to the disk.")
         End Try
      End Sub
   End Class
End Namespace     
//The request is placed at the assembly level.
using System.Security.Permissions;
[assembly:FileIOPermission(SecurityAction.RequestMinimum, Unrestricted = true)]

namespace MyNamespace {
   using System;
   using System.Security;
   //The hypothetical class log is in this namespace.
   using LogNameSpace;

   public class MyClass {
      public MyClass() {
      }

      public static void Main(string[] args) {
         //Put any code that requires optional permissions in the try block. 
         try {
            Log MyLog = new Log();
            MyLog.MakeLog();
            Console.WriteLine("The Log has been created.");
         }
         //Catch the security exception and inform the user that the 
         //application was not granted FileIOPermission.
         catch(SecurityException) {
            Console.WriteLine("This application does not have permission to write to the disk.");
         }
      }
   }
}

Вышеприведенный код создает лог-файл и отображает на консоли следующее сообщение, если располагает достаточными правами:

The Log has been created.

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

This application does not have permission to write to the disk.

См. также

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

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

Ссылки

SecurityAction

FileIOPermission

UIPermission

Другие ресурсы

Расширение метаданных с помощью атрибутов

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