Вопрос

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

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

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

Спасибо!

Это было полезно?

Решение

На самом деле для этого вам не нужно специальное разрешение, но вам нужен настраиваемый атрибут, похожий на 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.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top