[#C] خطای UnAuthorizeException در زمان ایجاد فایل

سلام

من یه فایل ستاپ ساختم. وقتی برنامه اجرا میشه باید به فایل text در پوشه برنامه بسازه.اما UnauthorizedAccessException میده. چه جوری فایل را ایجاد کنم؟

ممنون از کمکتون
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام

من یه فایل ستاپ ساختم. وقتی برنامه اجرا میشه باید به فایل text در پوشه برنامه بسازه.اما UnauthorizedAccessException میده. چه جوری فایل را ایجاد کنم؟

ممنون از کمکتون
برنامه #C تون این کار رو می کنه یا با یک نرم افزار Setup ساز اینکار رو انجام می دهید؟
اول باید بررسی کنید که خطا به دلیل عدم دسترسی مناسب ئه یا کد اشکال داره. روی فایل اجرایی که خطا میده راست کلیک کنید و با گزینه Run as Administrator اجراش کنید، اگه مشکل رفع شد، مربوط به نیاز
به دسترسی Administrator ئه که یک مساله عادی ئه، خیلی از برنامه ها موقع اجرا باید با وضعیت Run as Administrator اجرا شوند. بعضی از برنامه های Setup ساز برای چنین وضعیت هایی تنظیم دارند.
اما اگه مشکل رفع نشد و در حالت اجرای Run as Administrator باز هم همین مشکل پیش اومد کد باید بررسی بشه و باید کد تون رو ارائه کنید.
 
ممنون از جوابتون. با Run As Admin حل شد. در واقع برنامه رو طوری نوشته بودم که همیشه در حین بالا آمدن باید وجود یک فایل خاص را چک میکرد و اگر وجود نداشت می بایست آن فایل را ایجاد میکرد.

حالا یه سوال : چه جوری من میتونم اون فایل را با مجوز Admin ایجاد کنم بدون اینکه برنامه را بصورت Admin اجرا کنم؟

کد:

کد:
private bool CheckLogin()        {
            if (File.Exists(ConfigurationManager.AppSettings["login_info"]))
            {
                StreamReader sr = new StreamReader(ConfigurationManager.AppSettings["login_info"]);
                string message = sr.ReadToEnd();
                sr.Close();
                message = EncryptString.Decrypt_Text(message);
                if (message != null)
                {
                    string[] login_data = message.Split('&');
                    if (login_data.Length == 4)
                    {
                        int user_id = int.Parse(login_data[0]);
                        string computer_name = login_data[1];
                        string cookie = login_data[2];
                        DateTime expire = DateTime.Parse(login_data[3]);
                        if (computer_name != Environment.UserDomainName)
                        {
                            MessageBox.Show("اطلاعات لاگین مربوط به شما نمی باشد", "MS", MessageBoxButton.OK, MessageBoxImage.Error);
                        }
                        else if (DateTime.Now.Subtract(expire).Days == 0)
                        {
                            MessageBox.Show("کوکی شما منقضی شده است. مجددا به سرور متصل شوید", "MS", 
                                MessageBoxButton.OK, MessageBoxImage.Warning);
                        }
                        else
                        {
                            Share.cookie = cookie;
                            Share.userID = user_id;
                            return true;
                        }
                    }
                }
            }
            else
[SIZE=2][B][COLOR=#ff0000]                File.CreateText(ConfigurationManager.AppSettings["login_info"])[/COLOR][/B][/SIZE];
            return false;
        }


مقدار ConfigurationManager.AppSettings["login_info"] در فایل کانفیگ برابر login_info.txt هست که باعث میشه فایل در پوشه برنامه ساخته بشه.
دوم اینکه : به این سوال من هم جواب دهید. ممنون.
 
آخرین ویرایش:

the_king

مدیرکل انجمن
ممنون از جوابتون. با Run As Admin حل شد. در واقع برنامه رو طوری نوشته بودم که همیشه در حین بالا آمدن باید وجود یک فایل خاص را چک میکرد و اگر وجود نداشت می بایست آن فایل را ایجاد میکرد.

حالا یه سوال : چه جوری من میتونم اون فایل را با مجوز Admin ایجاد کنم بدون اینکه برنامه را بصورت Admin اجرا کنم؟

کد:
کد:
private bool CheckLogin()        {
            if (File.Exists(ConfigurationManager.AppSettings["login_info"]))
            {
                StreamReader sr = new StreamReader(ConfigurationManager.AppSettings["login_info"]);
                string message = sr.ReadToEnd();
                sr.Close();
                message = EncryptString.Decrypt_Text(message);
                if (message != null)
                {
                    string[] login_data = message.Split('&');
                    if (login_data.Length == 4)
                    {
                        int user_id = int.Parse(login_data[0]);
                        string computer_name = login_data[1];
                        string cookie = login_data[2];
                        DateTime expire = DateTime.Parse(login_data[3]);
                        if (computer_name != Environment.UserDomainName)
                        {
                            MessageBox.Show("اطلاعات لاگین مربوط به شما نمی باشد", "MS", MessageBoxButton.OK, MessageBoxImage.Error);
                        }
                        else if (DateTime.Now.Subtract(expire).Days == 0)
                        {
                            MessageBox.Show("کوکی شما منقضی شده است. مجددا به سرور متصل شوید", "MS", 
                                MessageBoxButton.OK, MessageBoxImage.Warning);
                        }
                        else
                        {
                            Share.cookie = cookie;
                            Share.userID = user_id;
                            return true;
                        }
                    }
                }
            }
            else
[SIZE=2][B][COLOR=#ff0000]                File.CreateText(ConfigurationManager.AppSettings["login_info"])[/COLOR][/B][/SIZE];
            return false;
        }


دوم اینکه : به این سوال من جواب دهید. ممنون.

اصولا برنامه شما فقط باید اعلام کنه که به دسترسی Administrator احتیاج داره، فقط همین. اینکه کاربر برنامه شما رو با چه دسترسی ای اجرا میکنه اصولا دست شما نیست.
از این بابت میگم اصولا که بعضی از ابزار ها هستند که سیستم عامل رو وادار به اجرا کردن یک برنامه با دسترسی Administrator بکنند که ویروس کش ها جزو موارد مشکوک شناسایی شون می کنند.
برای همین توصیه می کنم که صرفا در برنامه تون نیاز به دسترسی Administrator رو اعلام کنید، بقیه برنامه ها هم همین کار رو می کنند.

اگه شما تنظیم لازم رو برای برنامه تون انجام بدید و تنظیم UAC یا User Account Control ویندوز هم در سیستم کاربر غیر فعال نباشه، خود ویندوز صفحه رو تاریک می کنه و از کاربر برای اجرا شدن برنامه شما
پیغام میده، وگرنه با UAC غیر فعال کاربر متوجه نمیشه و برنامه تون خطا میده و بهتره که خودتون با try catch در برنامه تون یک پیغام به کاربر نشون بدید که لطفا با دسترسی Administrator اجرایش کنید.

در ویژوال استدیو که پروژه تون باز ئه، در منوی Project گزینه ...Add New Item رو انتخاب کنید. در بخش General گزینه Application Manifest File رو انتخاب کنید و به پروژه تون اضافه کنید.
در کد اون فایلی که اضافه شده یک سطر کد </ "requestedExecutionLevel level="asInvoker" uiAccess="false> هست که رنگ مقادیر asInvoker و false اش مشخصا فرق می کنه
(با سطر های توضیحی بالاترشون که تماما یک رنگ هستند اشتباه نگیرید)
مقدار اون asInvoker رو باید به requireAdministrator تغییر بدهید تا برنامه تون به سیستم عامل اعلام کنه که به دسترسی Administrator نیاز داره. (شبیه به اون سطر چند خط بالاتر هست که البته توضیحی ئه و نادیده گرفته میشه.)

در ضمن در کد ()CheckLogin تان try catch ندارید. بهتره که اضافه کنید تا بجای اون خطای UnauthorizedAccessException یک پیغام مناسب نشون بده :
کد:
        private bool CheckLogin()
        {
[B][COLOR="#0000FF"]            try
            {
[/COLOR][/B]                if (File.Exists(ConfigurationManager.AppSettings["login_info"]))
                {
                    StreamReader sr = new StreamReader(ConfigurationManager.AppSettings["login_info"]);
                    string message = sr.ReadToEnd();
                    sr.Close();
                    message = EncryptString.Decrypt_Text(message);
                    if (message != null)
                    {
                        string[] login_data = message.Split('&');
                        if (login_data.Length == 4)
                        {
                            int user_id = int.Parse(login_data[0]);
                            string computer_name = login_data[1];
                            string cookie = login_data[2];
                            DateTime expire = DateTime.Parse(login_data[3]);
                            if (computer_name != Environment.UserDomainName)
                            {
                                MessageBox.Show("اطلاعات لاگین مربوط به شما نمی باشد", "MS", MessageBoxButton.OK, MessageBoxImage.Error);
                            }
                            else if (DateTime.Now.Subtract(expire).Days == 0)
                            {
                                MessageBox.Show("کوکی شما منقضی شده است. مجددا به سرور متصل شوید", "MS",
                                    MessageBoxButton.OK, MessageBoxImage.Warning);
                            }
                            else
                            {
                                Share.cookie = cookie;
                                Share.userID = user_id;
                                return true;
                            }
                        }
                    }
                }
                else
                    File.CreateText(ConfigurationManager.AppSettings["login_info"]);
[B][COLOR="#0000FF"]            }
            catch
            {
                MessageBox.Show("برنامه به دسترسی ادمین نیازمند است", "MS", MessageBoxButton.OK, MessageBoxImage.Error);
            }
[/COLOR][/B]            return false;
        }
 
ممنون از جوابتون. من اگه بخوام توی برنامه از رجیستری استفاده بشه چه جاهایی ازش استفاده کنم؟
 

the_king

مدیرکل انجمن
ممنون از جوابتون. من اگه بخوام توی برنامه از رجیستری استفاده بشه چه جاهایی ازش استفاده کنم؟

چه عرض کنم، به برنامه تون بستگی داره، معمولا برای ذخیره سازی تنظیمات برنامه ازش استفاده میشه، البته برای ذخیره سازی تنظیمات پروژه اختصاصا در منوی Project > {project name} Properties بخش Settings
هست که کار کردن باهاش ساده تر از Registry ئه.
 

جدیدترین ارسال ها

بالا