PDA

View Full Version : آموزش: مشکل readonly بودن دیتا بیس برنامه نصب شده



dashkeyvan
یک شنبه 15 دی 1392, 12:37 عصر
به نام خدا

حتما خیلی ها این مشکل رو داشتن که وقتی برنامتون رو خروجی میگیرین و و نصبش میکنن واگه تو درایو C نصبش کنن ویندوز به طور خودکار اونو فقط خواندنی میکنه و شما نمیتونید رو دیتابیس اطلاعات درج کنین فقط میتونید بخونید.
البته این از ویندوز 7 به این ور اینجوری شده راه درست کردنش اینه که مایکرو سافت یه پوشه اختصاص داده برای دیتا های نرم افزار ها (AppData)شما هم باید در فرم لودتون در لحظه ای هیچ ارتباطی با دیتا بیس ندارین یه پوشه برای خودتون nدر appdata بسازید و دو فایل دیتا بیستون رو اونجا کپی کنید به این شکل

دقت کنید کد هارو جای بزارید که وقتی اجرا میشه قبلش برنامه هیچ ارتباطی با دیتا بیس نداشته باشد.وگرنه ارور میده
تو کپی کردن مسیر ها دقت کنید !!!

اول چک میکنیم ببنیم که فایل وجود نداشته باشه اگه وجود داشت هیچ کاری نکنه و اگه یکیش اتفاقی پاک شده باشه اون یکی رو هم پاک کنه دوباره دوتا فایلو کپی کنه
و اگه جفتش نبود بازم کپی کنه


private void Splash_Screen_Form_Load(object sender, EventArgs e)
{
try
{
if (!File.Exists(@"C:\Users\key1\AppData\Roaming\MKfeenet\Server\Data \db_mkfeenet.mdf") && !File.Exists(@"C:\Users\key1\AppData\Roaming\MKfeenet\Server\Data \db_mkfeenet_log.ldf"))
{
database();
}
if(!File.Exists(@"C:\Users\key1\AppData\Roaming\MKfeenet\Server\Data \db_mkfeenet.mdf") && File.Exists(@"C:\Users\key1\AppData\Roaming\MKfeenet\Server\Data \db_mkfeenet_log.ldf"))
{
File.Delete(@"C:\Users\key1\AppData\Roaming\MKfeenet\Server\Data \db_mkfeenet_log.ldf");
database();
}
if (File.Exists(@"C:\Users\key1\AppData\Roaming\MKfeenet\Server\Data \db_mkfeenet.mdf") && !File.Exists(@"C:\Users\key1\AppData\Roaming\MKfeenet\Server\Data \db_mkfeenet_log.ldf"))
{
File.Delete(@"C:\Users\key1\AppData\Roaming\MKfeenet\Server\Data \db_mkfeenet.mdf");
database();
}

}




اینم تابعی کپی کردن دیتا بیس در مسیر دلخواهتون


private void database()
{
//
pathString = @"C:\Users\key1\AppData\Roaming\MKfeenet\Server\Data";
Directory.CreateDirectory(pathString);
//
sourceFile1 = Application.StartupPath + @"\Data\Server_Data\db_mkfeenet.mdf";
destinationFile1 = @"C:\Users\key1\AppData\Roaming\MKfeenet\Server\Data \db_mkfeenet.mdf";
File.Copy(sourceFile1, destinationFile1);
//
sourceFile2 = Application.StartupPath + @"\Data\Server_Data\db_mkfeenet_log.ldf";
destinationFile2 = @"C:\Users\key1\AppData\Roaming\MKfeenet\Server\Data \db_mkfeenet_log.ldf";
File.Copy(sourceFile2, destinationFile2);
}

کامبیز اسدزاده
یک شنبه 15 دی 1392, 16:16 عصر
دسترسی لازم به پوشه ای که دیتابیس شما در آن هست رو درست کنید ! این مشکل از سیستم عامل است البته مشکل نه ! به خاطر موارد امنیتی تمامی پوشه ها در درایو C دارای مجوز های خاصی هستند.
برای بررسی بیشتر سعی کنید دسترسی هارو تغییر بدین و یا در درایو دیگری به جز درایو C دیتابیس های خود را قرار دهید.

dashkeyvan
یک شنبه 15 دی 1392, 19:30 عصر
روش استاندارد اینه شما که نمیتونی به مشتری بگی اگه مشکل داشت سطح دسترسی درست کن!
همه نرم افزارا همین کارو میکنن یه سر به پوشه اپدیتاتون بزنید میبینید

sh
دوشنبه 08 اردیبهشت 1393, 23:48 عصر
با وجود اینکه چند ماه از این تاپیک گذشته و من بصورت اتفاقی این رو دیدم

شما میتونی دیتا بیس رو در کنار فایل اجرایی داشته باشی و از کلاس زیر در یک BackgroundWorker در فرم لوگین به برنامه یا اولین فرم برنامه استفاده کنی


using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Security.AccessControl;

public sealed class FileHelper
{
private FileHelper()
{
}

static string p = AppDomain.CurrentDomain.BaseDirectory;
public static void SetSecurity()
{
string[] files = System.IO.Directory.GetFiles(p);
foreach (string file in files) {
if (file.EndsWith(".ldf") | file.EndsWith(".mdf")) {
FileSecurity oFileSecurity = new FileSecurity();
oFileSecurity.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule ("Everyone", System.Security.AccessControl.FileSystemRights.Ful lControl, System.Security.AccessControl.AccessControlType.Al low));
System.IO.File.SetAccessControl(file, oFileSecurity);

}
}

}

}

hidden68
سه شنبه 09 اردیبهشت 1393, 01:42 صبح
با وجود اینکه چند ماه از این تاپیک گذشته و من بصورت اتفاقی این رو دیدم

شما میتونی دیتا بیس رو در کنار فایل اجرایی داشته باشی و از کلاس زیر در یک BackgroundWorker در فرم لوگین به برنامه یا اولین فرم برنامه استفاده کنی


using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Security.AccessControl;

public sealed class FileHelper
{
private FileHelper()
{
}

static string p = AppDomain.CurrentDomain.BaseDirectory;
public static void SetSecurity()
{
string[] files = System.IO.Directory.GetFiles(p);
foreach (string file in files) {
if (file.EndsWith(".ldf") | file.EndsWith(".mdf")) {
FileSecurity oFileSecurity = new FileSecurity();
oFileSecurity.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule ("Everyone", System.Security.AccessControl.FileSystemRights.Ful lControl, System.Security.AccessControl.AccessControlType.Al low));
System.IO.File.SetAccessControl(file, oFileSecurity);

}
}

}

}



















اگه امکان داره بیشتر توضیح بدید
2 ماهه که این مشکل رو دارم
فک کردم ویروسه که تمام پوشه های سیستممو رید اونلی کرده
ویندوز عوض کردم
دیدم بازم ریداونلیه
بردمش خدمات کامپیوتری
گفت ویروسه بوت سکتره
اطلاعاتتو بریز تو هارد اکسترنال و...
دیگه نمیگم
خجالت میکشم بگم:خجالت:
خلاصه بعد از 2 ماه درگیری فهمیدیم همه ی ویندوز 7 ها اینطوری هستن
حالا هم دنبال راه حل بودم این تاپیکو دیدم
کلی ذوق کردم
اما متوجه نشدم لطفآ بیشتر توضیح بدید
ممنون

ASKaffash
سه شنبه 09 اردیبهشت 1393, 07:14 صبح
سلام
ممنون که راه حل فنی ارائه دادید لطفا بگوئید شما با این روش تا به حال به مشکلی روی 7 و 8 برنخوردید


با وجود اینکه چند ماه از این تاپیک گذشته و من بصورت اتفاقی این رو دیدم

شما میتونی دیتا بیس رو در کنار فایل اجرایی داشته باشی و از کلاس زیر در یک BackgroundWorker در فرم لوگین به برنامه یا اولین فرم برنامه استفاده کنی


using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Security.AccessControl;

public sealed class FileHelper
{
private FileHelper()
{
}

static string p = AppDomain.CurrentDomain.BaseDirectory;
public static void SetSecurity()
{
string[] files = System.IO.Directory.GetFiles(p);
foreach (string file in files) {
if (file.EndsWith(".ldf") | file.EndsWith(".mdf")) {
FileSecurity oFileSecurity = new FileSecurity();
oFileSecurity.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule ("Everyone", System.Security.AccessControl.FileSystemRights.Ful lControl, System.Security.AccessControl.AccessControlType.Al low));
System.IO.File.SetAccessControl(file, oFileSecurity);

}
}

}

}

sh
سه شنبه 09 اردیبهشت 1393, 08:18 صبح
پوشه program Files جزء پوشه های محافظت شده در ویندوز ویستا و 7 به بعد می باشد. به همین خاطر وقتی از Sqlexpress استفاده میشه و فایلهای دیتا بیس در کنار فایل اجرایی باشند حالت ReadOnly به خود میگیرند که با استفاده از قطعه کد بالا میتوان در اجرای اولین فرم برنامه ، سطح دسترسی را برای همه کاربران سیستم فعال کرد.
البته میتوان فایل دیتا بیس را در مسیر ProgramData که در ریشه درایو C و بصورت مخفی است کپی کرد و یا در پوشه AppData در مسیر پوشه Users قرار داد

hidden68
سه شنبه 09 اردیبهشت 1393, 11:35 صبح
پوشه program Files جزء پوشه های محافظت شده در ویندوز ویستا و 7 به بعد می باشد. به همین خاطر وقتی از Sqlexpress استفاده میشه و فایلهای دیتا بیس در کنار فایل اجرایی باشند حالت ReadOnly به خود میگیرند که با استفاده از قطعه کد بالا میتوان در اجرای اولین فرم برنامه ، سطح دسترسی را برای همه کاربران سیستم فعال کرد.
البته میتوان فایل دیتا بیس را در مسیر ProgramData که در ریشه درایو C و بصورت مخفی است کپی کرد و یا در پوشه AppData در مسیر پوشه Users قرار داد

منظورتون اینه این قطعه کدو بزاریم اول کد فرم اصلی؟
همین؟
دیگه نیاز به فراخوانیه کلاس نیست؟
هیچ کار دیگه ایی نیاز نیست؟

sh
سه شنبه 09 اردیبهشت 1393, 13:34 عصر
عرض کردم در اولین پست. شما یک backgroundworker روی اولین فرمی که پروژه اجرا میشه قرار داده و در رویداد dowork از کلاس استفاده میکنی






private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)




{



FileHelper.SetSecurity();




}