1

ドキュメントを読み、インターウェブを精査しましたが、カスタム CAS アクセス許可を作成しないと、やりたいことを実行できないようです。だから、これが私の最後の溝の試みです。

クラスで FileIOPermission (属性) を宣言的に定義して、ユーザーの MyDocuments ディレクトリへのアクセス許可を要求したいと考えています。このディレクトリは、すべてのオペレーティング システムで一貫しているわけではなく、通常は Path.GetFolderPath を介して .net にアクセスし (そうだと思います)、SpecialFolder 列挙値を渡します。FileIOPermissionAttribute に「トークン」構文、またはランタイムに伝える類似の機能がありますか?「このシステム上のどこにいても、この SpecialFolder にアクセスできますか?」

そうでない場合は、基本的にそれを行うカスタム Permission オブジェクトを作成する必要があると思います...

ありがとう!

4

1 に答える 1

2

このためのカスタム アクセス許可は実際には必要ありませんが、FileIOPermissionAttribute に似たカスタム属性が必要です。その CreatePermission メソッドで、属性に渡される SpecialFolder 値に対応する実際のフォルダー パスの FileIOPermission を作成できます。例(いくつかの検証を追加する必要があります):

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

ここで注意すべきことの 1 つは、Environment.GetFolderPath がターゲット フォルダーへの PathDiscovery アクセスを要求するため、CreatePermission メソッドでそのアクセス許可をアサートするかどうかを決定する必要があることです。(個人的には、BCL チームが最初に FileIOPermissionAttribute で特別なフォルダーのサポートを実装しなかった理由の 1 つは、これに関する複雑な問題ではないかと思います。)

于 2009-09-18T12:55:11.320 に答える