Pergunta

Eu li sobre a documentação, vasculhei as interwebs e parece que o que quero fazer não pode ser feito sem escrever uma permissão personalizada do CAS. Então, aqui está minha última tentativa de vala.

Quero definir declarativamente uma FileioPermission (Attribute) na minha classe para exigir permissão para o diretório MyDocuments do Usuários. Esse diretório não é consistente em todos os sistemas operacionais e geralmente é acessado no .NET através do path.getFolderPath (eu acho que é isso), passando um valor de enum SpecialFolder. Existe alguma sintaxe de 'token', ou recurso semelhante no FileioPermissionAttribute para dizer ao tempo de execução - 'Dê -me acesso a esta dobra especial, onde quer que esteja neste sistema'?

Caso contrário, acho que terei que escrever um objeto de permissão personalizado que faça essencialmente isso ...

Obrigado!

Foi útil?

Solução

Na verdade, você não precisa de uma permissão personalizada para isso, mas precisa de um atributo personalizado que se assemelhe ao FileIoPerionAttribute. Em seu método CreatePermission, você pode criar uma operadora de arquivo para o caminho real da pasta correspondente ao valor do SpecialFolder passado ao atributo. por exemplo (que precisa de alguma validação adicionada):

[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;
    }
}

Uma coisa a observar aqui é que o ambiente.GetFolderPath fará uma demanda por acesso a PathDoCovery na pasta de destino; portanto, você terá que decidir se deseja afirmar essa permissão no seu método de criação. (Pessoalmente, suspeito que as complicações em torno disso podem ser uma das razões pelas quais a equipe da BCL não implementou o suporte especial de pastas no FileioPermissionAttribute em primeiro lugar.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top