سؤال

لقد قرأت على الوثائق ، وتجوبت interwebs ، ويبدو أنه لا يمكن القيام بما أريد القيام به دون كتابة إذن CAS مخصص. لذلك ، ها هي محاولة الخندق الأخيرة.

أريد أن أحدد بشكل إعلاني (السمة) على فئتي للطلب للحصول على إذن إلى مستخدمي MyDocuments Directory. هذا الدليل غير متسق على جميع أنظمة التشغيل ، ويتم الوصول إليه عمومًا في .NET من خلال path.getFolderPath (أعتقد أن هذا هو) ، ويمرر قيمة تعداد المصلحة. هل هناك أي بناء جملة "رمز" ، أو ميزة مماثلة في FileiOperMissionAttribute لقوله في وقت التشغيل - "أعطني الوصول إلى هذا المخصص ، أينما كان على هذا النظام"؟

إذا لم أكن أعتقد أنني سأضطر إلى كتابة كائن إذن مخصص يقوم بذلك بشكل أساسي ...

شكرًا!

هل كانت مفيدة؟

المحلول

لا تحتاج فعليًا إلى إذن مخصص لهذا ، لكنك تحتاج إلى سمة مخصصة تشبه FileiOperMissionAttribute. في طريقة CreatePermission الخاصة بها ، يمكنك إنشاء 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;
    }
}

شيء واحد يجب الانتباه إليه هنا هو أن البيئة. سيقوم GetFolderPath بطلب الوصول إلى الوصول إلى المجلد المستهدف ، لذلك يتعين عليك أن تقرر ما إذا كنت تريد تأكيد هذا الإذن في طريقة CreatePermission الخاصة بك. (أنا شخصياً أظن أن المضاعفات المحيطة بهذا قد تكون أحد الأسباب التي تجعل فريق BCL لم ينفذ دعم المجلد الخاص في FileIopermissionattribute في المقام الأول.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top