سؤال

لقد قمت بإنشاء مجموعة مواقع داخل تطبيق ويب مع المستخدم أ كمسؤول مجموعة مواقع مشتركة.لقد قمت بإضافة رابط في صفحة ميزات الموقع.عند النقر على هذا الرابط، أحاول إنشاء وظيفة مؤقت. وفيما يلي الكود الذي يتم تنفيذه عند النقر على الرابط

//Allow unsafe updates.
 SPContext.Current.Web.AllowUnsafeUpdates = true;

//Get current web application.
SPWebApplication webApp = SPContext.Current.Site.WebApplication;

// Create new job.
ArchiveJob automaticArchiveJob = new ArchiveJob(scheduleDetails.scheduleName, webApp);

SPHourlySchedule hourlySchedule = new SPHourlySchedule();
hourlySchedule.BeginMinute = 0;
hourlySchedule.EndMinute = 1;
automaticArchiveJob.Schedule = hourlySchedule;

//Finally update archival job.
automaticArchiveJob.Update();

الآن عندما قمت بتسجيل الدخول باستخدام المستخدم أ والنقر فوق هذا الرابط في صفحة "إعدادات الموقع"، أحصل على استثناء أمني مع رسالة "تم رفض الوصول" في السطر automaticArchiveJob.Update().ولكن إذا قمت بتسجيل الدخول باستخدام مستخدم مسؤول (لقد قمت أيضًا بتسجيل الدخول إلى الجهاز باستخدام هذا المستخدم) وقمت بالنقر فوق الارتباط، فسيتم إنشاء المهمة بنجاح.كما أنني جعلت المستخدم عضوًا في WSS_ADMIN_WPG المجموعة ولكن لا تزال تواجه نفس المشكلة.هل هناك أي شيء آخر يجب علي فعله لحل المشكلة.

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

المحلول

يعد "تم رفض الوصول" سلوكًا متوقعًا نظرًا لما تحاول القيام به.اسمحوا لي أن أشرح.

عند إنشاء مثيل وظيفة مؤقت، يتم الاحتفاظ به في قاعدة بيانات تكوين المزرعة.يعد الوصول إلى قاعدة البيانات هذه لأغراض الكتابة عملية مميزة؛كقاعدة عامة، لن ينجح سوى حساب خدمة المزرعة (أي الحساب الذي يتم من خلاله تنفيذ OWSTIMER.EXE) أو الحسابات التي تتمتع بالحقوق المطلوبة لتنفيذ مثل هذه العملية على قاعدة بيانات التكوين (المسؤولون عادةً).

بشكل افتراضي، ستفشل محاولة إنشاء مهمة مؤقت من داخل سياق مجموعة الموقع.لن تؤدي محاولة العملية في كتلة امتيازات مرتفعة (عبر SPSecurity.RunWithElevatedPrivileges) إلا إلى استخدام سياق حساب تجمع التطبيقات الخاص بتطبيق الويب بدلاً من سياق المستخدم الحالي؛ينجح هذا فقط إذا كان حساب تجمع التطبيقات لديه حقوق الكتابة إلى قاعدة بيانات تكوين المزرعة.إذا حدث هذا، فعادةً ما يرجع ذلك إلى (أ) استخدام حساب خدمة المزرعة في أدوار لا ينبغي أن يكون فيها (لتشغيل تطبيقات ويب المحتوى، على سبيل المثال)، أو (ب) تم منح أذونات إضافية إلى تجمع التطبيقات حساب.وتمثل كلتا الحالتين انحرافاً عن نموذج التشغيل القائم على أفضل الممارسات.

عادةً ما يتم إنشاء مثيلات مهمة المؤقت في وقت تنشيط الميزة في الميزات التي يتم تحديد نطاقها إما على مستوى المزرعة أو WebApplication.لماذا؟نظرًا لأن هذه الميزات يتم تنشيطها عادةً بواسطة المسؤولين إما من سطر الأوامر (بافتراض أن المسؤول لديه أيضًا حقوق في قاعدة بيانات تكوين المزرعة) أو من داخل الإدارة المركزية (حيث يحدث التنشيط من خلال حساب خدمة المزرعة - مع ضمان الحصول على حقوق قاعدة بيانات التكوين ).عندما يتم تنشيط الميزة ويتم استدعاء الأسلوب featureActivated الخاص بـ SPFeatureReceiver، فمن الآمن (من منظور أمني) إعداد مهمة المؤقت.

إن حل مشكلتك الخاصة بشكل صحيح سوف يتضمن قلب المشكلة رأسًا على عقب قليلاً.بدلاً من محاولة إنشاء مهمة المؤقت من داخل مجموعة الموقع حسب الطلب، أوصي بإعداد ما يعادل مهمة المؤقت "المسح" في الوقت الذي يتم فيه تنشيط الميزة الخاصة بك.من المسلم به أن هذا يتطلب تخطيطًا وجهدًا أكبر مما تحاول القيام به، ولكن المسار الحالي الخاص بك لن يعمل إلا إذا تم تعديل الأمان بطريقة ما - وهذا غير مستحسن.

عندما كنت أقوم بتجميع ميزة تدفق مزرعة ذاكرة التخزين المؤقت لـ BLOB (http://blobcachefarmflush.codeplex.com)، كان علي أن أفعل نفس الشيء بنفسي.يمكنك الاطلاع على تفاصيل الطريقة التي عملت بها من خلال إنشاء وظيفة المؤقت في فئة FeaturesReceiver (BlobCacheFlushFlushSweepJobFeatureReceiver).قد تساعد بقية التعليمات البرمجية والوثائق المرتبطة بها أيضًا في التغلب على بعض التحديات الأخرى التي تظهر.

لا تتردد في استخدام ما تجده بأي شكل من الأشكال؛لهذا السبب هناك!

أتمنى أن يساعد ذلك.إذا كانت هناك أسئلة متابعة، فاطردها وسأجيب بأفضل ما أستطيع :-)

نصائح أخرى

وفي محاولة لتجاوز أسلوب SPPersistedObject.HasAdditionalUpdateAccess () والعودة الحقيقية.

وprotected override bool HasAdditionalUpdateAccess() { return true; }

ولقد استخدمت RunWithElevatedPrivileges

وSPSecurity.RunWithElevatedPrivileges (مندوب () { })؛

وكان يعمل للي ..... هل لدى أي شخص آخر حل؟ إذا كان الأمر كذلك اسمحوا لي أن أعرف.

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