2009-09-17 1 views
1

Я прочитал документацию, просмотрел interwebs, и кажется, что я хочу сделать, не может быть сделано без написания пользовательского разрешения CAS. Итак, вот моя последняя попытка канавы.Объявление FileIOPermission по специальным папкам

Я хочу ОПРЕДЕЛЕННО определить атрибут FileIOPermission (Attribute) в своем классе, чтобы потребовать разрешения для каталога MyDocuments пользователей. Этот каталог несовместим со всеми операционными системами и обычно доступен в .net через Path.GetFolderPath (я думаю, что это так), передавая значение перечисления SpecialFolder. Есть ли какой-либо синтаксис «токена» или аналогичная функция в FileIOPermissionAttribute, чтобы сказать во время выполнения - «дать мне доступ к этому специальному накопителю, где бы он ни находился в этой системе»?

Если нет, я думаю, мне придется написать собственный объект Permission, который делает по существу, что ...

Спасибо!

ответ

2

Для этого вам не требуется специальное разрешение, но вам нужен настраиваемый атрибут, похожий на FileIOPermissionAttribute. В методе CreatePermission вы можете создать FileIOPermission для фактического пути папки, соответствующего значению SpecialFolder, переданному атрибуту. например (Что необходимо добавил некоторые проверки):

[Serializable] 
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Struct | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)] 
public sealed class SpecialFolderIOPermissionAttribute : CodeAccessSecurityAttribute 
{ 
    private Environment.SpecialFolder _folder; 
    private FileIOPermissionAccess _access; 

    public SpecialFolderIOPermissionAttribute(SecurityAction action) 
     : base(action) 
    { 
     this.Unrestricted = true; 
    } 

    public Environment.SpecialFolder Folder 
    { 
     get 
     { 
      return this._folder; 
     } 
     set 
     { 
      this._folder = value; 
      this.Unrestricted = false; 
     } 
    } 

    public FileIOPermissionAccess Access 
    { 
     get 
     { 
      return this._access; 
     } 
     set 
     { 
      this._access = value; 
      this.Unrestricted = false; 
     } 
    } 

    public override IPermission CreatePermission() 
    { 
     FileIOPermission permission; 
     if (this.Unrestricted) 
     { 
      permission = new FileIOPermission(PermissionState.Unrestricted); 
     } 
     else 
     { 
      permission = new FileIOPermission(this.Access, Environment.GetFolderPath(this.Folder)); 
     } 

     return permission; 
    } 
} 

Одна вещь, чтобы следить за вот что Environment.GetFolderPath сделает спрос на доступ PathDiscovery на целевую папку, так что вы должны решить, если вы хотите утвердите это разрешение в методе CreatePermission. (Лично я подозреваю, что осложнения вокруг этого могут быть одной из причин того, что команда BCL не реализовала специальную поддержку папок в FileIOPermissionAttribute в первую очередь.)