PDA

View Full Version : مشکل در file system access rule



farna1
دوشنبه 19 اردیبهشت 1390, 19:01 عصر
با سلام به همگی.
من یه برنامه نوشتم که هر یوزر تو شبکه لوکال میبایست روی فولدری که share هست یه فولدر ایجاد کنه و فایلهاش رو داخل اون بگذاره.این هم کدش هست:
DirectoryInfo di = new DirectoryInfo(@"\\Server\Test\test1");
DirectorySecurity ds=new DirectorySecurity();
ds.SetAccessRule(new FileSystemAccessRule(Enviroment.Username,
FileSystemRights.FullControl, AccessControlType.Deny));
di.Create(ds);


حالا موقعی که ادمین دامین میخواد فایلهای موجود هر فولدر دسترسی داشته باشه با این خطا برنامه متوقف میشه:
Attempted to perform an unauthorized operation

و این هم کدهای ادمین هست که اجرا میکنم:
DirectoryInfo di = new DirectoryInfo(@"\\Server\Test\test1");
DirectorySecurity ds=new DirectorySecurity();
ds.SetAccessRule(new FileSystemAccessRule(Enviroment.Username,
FileSystemRights.FullControl, AccessControlType.Allow));
di.SetAccessControl(ds);

ممنون میشم اگر کسی میدونه مشکل کارم کجاست منو راهنمایی کنه.

alirezalink
سه شنبه 20 اردیبهشت 1390, 12:23 عصر
مطمئنید که فولدر اصلی به صورت Full Control به اشتراک گذاشته شده؟

farna1
سه شنبه 20 اردیبهشت 1390, 12:27 عصر
بله فولدر اصلی Test دسترسیش everyone هست و فول کنترل هم هست.

alirezalink
سه شنبه 20 اردیبهشت 1390, 14:28 عصر
اشتباه شما در استفاده از Environment.UserName در کد سمت کلاینت هست که نباید ازش استفاده کنید. چون این متغیر به کاربر جاری سیستم کلاینت اشاره میکنه و وقتی شما دایرکتوری جدید رو با قاعده دسترسی بر مبنای کاربر سیستم کلاینت می سازید طبیعیه که ادمین نتونه بهش دسترسی داشته باشه چون این کاربر برای سیستم ادمین شناخته شده نیست. و توی دسترسی های دایرکتوری جدید دسترسی عمومی هم نیست. شما میتونید با کپی برداری از قواعد دسترسی شاخه مادر، فرزند رو هم به صورت وراثتی از همون دسترسی ها بهره مند کنید. برای اینکار از این کد در سمت کلاینت استفاده کنید. در این مثال از قواعد دسترسی پوشه f برای پوشه test4 که فرزندش هست استفاده میشه.

DirectoryInfo d=new DirectoryInfo(@"\\ARAGON-PC\f");
DirectoryInfo di = new DirectoryInfo(@"\\ARAGON-PC\f\test4");
di.Create(d.GetAccessControl());

farna1
سه شنبه 20 اردیبهشت 1390, 17:56 عصر
برای برداشتن هر نوع دسترسی بعد از ایجاد دایرکتوری میشه از کد زیر استفاده کرد؟

DirectorySecurity dSecurity = di.GetAccessControl();
dSecurity.AddAccessRule(new FileSystemAccessRule(Enviroment.Username,
FileSystemRights.FullControl, AccessControlType.Deny));
di.SetAccessControl(dSecurity);

alirezalink
سه شنبه 20 اردیبهشت 1390, 21:12 عصر
ببینید Environment به محیط کاربر جاری اشاره داره که اگه این کدی که نوشتید از طرف کلاینت اجرا بشه چون سیستم عامل سرور کاربر کلاینت رو نمیشناسه پس این قاعده دسترسی رو نادیده میگیره و از دسترسی های قبلی یا حالت پیشفرض استفاده میکنه و اینطور نمیشه که میخواید هر نوع دسترسی ازش حذف بشه. برای این کار از کد زیر استفاده کنید :

DirectorySecurity dSecurity = di.GetAccessControl();
dSecurity.AddAccessRule(new FileSystemAccessRule("Everyone",FileSystemRights.FullControl, AccessControlType.Deny));
di.SetAccessControl(dSecurity);