كيف يمكنني برمجيا تحقق الفعالة حذف (تعديل) أو الكتابة الأذونات في. NET؟

StackOverflow https://stackoverflow.com/questions/369273

  •  21-08-2019
  •  | 
  •  

سؤال

وعذرا مقدما على هذا السؤال الطويل. ما يهمني حقا هو وسيلة للتحقق برمجيا إذا كانت هوية النوافذ المنفذة نوافذ امتيازات كافية لكتابة إلى دليل (أو ملف) في تطبيق خدمات الويب ASP.NET. ولكن أنا سوف تسوية لاسترجاع فعالة الحذف (تعديل) امتيازات لمستخدم لدليل معين أو ملف. والمشكلة هي أن وأود أن تكون قادرة على القيام بذلك دون أي كتابة الملفات المؤقتة OR بالضرورة تنفيذ الإجراء IO والتعامل مع استثناء.

نعم، هناك سؤال حول هذا بالفعل (انظر <لأ href = "https://stackoverflow.com/questions/137031/how-can-i-programmatically-determine-if-i-have-write-privileges التي تستخدم و-ج-في شبكة "> كيف يمكنني برمجيا تحديد ما إذا كان لدي امتيازات الكتابة باستخدام C # في صافي؟ ) عادة أنا أتفق مع الجواب المقبول أن أفضل طريقة لمجرد محاولة العمل IO والتعامل مع أي استثناءات - طرق System.IO تفعل رمي System.UnauthorizedAccessException تشير إلى فشل نتيجة لرفض امتياز. ولكن في حالة من تحميل الملفات، كنت حقا ترغب في التحقق الامتيازات قبل إضاعة الوقت والموارد من تحميل البيانات لأنه فقط بعد تحميل نتمكن من محاولة لكتابة ملف أو مجلد في السؤال. أشفق أي من المستخدمين تحميل ملف 2GB عبر HTTP فقط أن يقال بعد تحميل اكتمال أنهم لم يكن لديك أذونات لتحميل الملف إلى الوجهة.

والنهج المعتاد لاختبار وصول الكتابة إذا كنت لا ترغب في تنفيذ الكتابة الفعلي لكتابة الملف المؤقت. والسؤال الآخر لديه إجابة لافتا من ذلك. وهذا هو ما يفعله رمز لنا حاليا. ولكن الأمن ويندوز يسمح بالوصول الكتابة دون امتيازات الحذف. المستخدمين مع وصول الكتابة فحسب، بل لا نهاية الحذف الأمر ترك جميع أنواع الملفات اعيد .TMP. ولا، نحن لا نريد استخدام حساب مشرف المجال لإعادة ACL على الملفات TMP ومن ثم حذفها. نهج لقد تم اتخاذ هو للتحقق مما إذا كان المستخدم قد إرسال امتيازات باستخدام System.IO.Directory.GetAccessControl (..) أو System.IO.File.GetAccessControl (..) والتعامل مع قواعد الوصول المختلفة والعوائد ACE ... ولكن مع هذا لا يزال لدي قضايا التعامل مع امتيازات فعالة - أي في معظم الحالات ولدي أيضا للبحث عن عضوية المستخدم في أي من المجموعات المدرجة في ACE التي لديها أذونات على الكائن. يجب أن يكون هناك طريقة أسهل .... لا هناك؟

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

المحلول

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

نصائح أخرى

هل يمكن أن يكون أيضا ملف دائم، ويقول "access_test.txt"، التي حاولت الكتابة مع تاريخ الختم أو شيء من هذا لأول مرة لاختبار وصول الحالي.

وPaul، أنا حقا أحب إجاباتك، وأعتقد أن في تطبيقات الويب العادية حيث هناك مجموعة معروفة وصغيرة نسبيا من المحتمل الدلائل تحميل الهدف، لديك الحل المناسب: 1 - إذا قد يكون التطبيق للمستخدمين الذين ليس لديهم privieleges إلحاق البيانات، يجب أن يكون كافة الدلائل تحميل ملف اختبار المعروف أن إلحاق يتم اختبار عمليات ضد للتحقق قبل التحميل
. 2 - إذا كان هناك أي قلق بشأن امتيازات إلحاق البيانات، ثم التطبيق يمكن أن يكتب للتو نسخة فارغة من الملف وإلحاق على تحميل. أنا قبول إجابتك للتأكد من الحصول على الائتمان لذلك.

للأسف، في طلبي نحن لم يكن لديك مجموعة محدودة أو يعرف من الدلائل تحميل الهدف - أي حصة أو مجلد في الشبكة قد تكون في متناول. ما نحن بصدد تنفيذ هو التخزين المؤقت للبيانات التحميل في قطع صغيرة نسبيا وفتح الملف الهدف في وضع إلحاق BUT عقد يقوم FileStream مفتوح لمدة تحميل (نعم هناك مخاوف للتعامل مع FileStreams التي يتم هذا عاش فترة طويلة) وهذا يعطي استثناء سريع (يحدث في أقرب وقت كما هو مكتوب أول قطعة ليقوم FileStream) إذا كان هناك أي امتيازات الكتابة ث / س كونها تعتمد على امتيازات إلحاق البيانات. ولكن لا أنصح هذا التصميم إلى أي شخص - إذا كنت تستطيع أن تفلت من العقاب محاولة واحدة من الحلول @ بول المقترحة. وإذا لم يكن لديك ما يدعو للقلق الرسائل في وقت مبكر من عدم وجود امتيازات الكتابة على تحميل، مجرد التعامل مع الاستثناءات ولا تقلق بشأن ذلك.

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