PDA

View Full Version : مشکل با Run As Startup



c-sharp_South
جمعه 02 تیر 1391, 15:04 عصر
سلام دوستان.
توی تاپیک ها خیلی خیلی گشتم و مطالب متعددی درباره ی Run as startup در C# وجود داشت ولی هیچ کدوم به این نکته ای که من میخوام اشاره ای نشده بود.


RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
rkApp.SetValue("MyApp", Application.ExecutablePath.ToString());

خب ما اومدیم گفتیم که برنامه بره توی startup و با هربار اجرا شدن ویندوز برنامه اجرا بشه.
خب ما میگیم برنامه مسیرش اینجا بوده:
C:\Users\lvleti\Downloads\Compressed\RunAtStartup\ RunAtStartup\RunAtStartup\bin\Debug\RunAtStartup.E XE
حالا اگه کاربر بیاد اسمه برنامه رو که RunAtStartup بوده به RunAtStartupppp تغییر بده یا برنامه رو به یک درایو دیگه منتقل کنه دیگه تموم میشه و با هربار اجرا شدن ویندوز برنامه ای نیست که اجرا بشه.
درسته که حتی اگه فرد اسم برنامه رو عوض کرد و یا مسیرش رو تغییر داد باز هم ممکنه که برنامه رو اجرا کنه و مسیر جدید برنامه در رجیستری ذخیره بشه،ولی ما فرض رو بر این میگیرم که این برنامه فقط یک بار قراره اجرا بشه و بعد از اون هم اسم و آدرس برنامه عوض بشه.
چه راه حلی برای این مورد پیشنهاد میدید؟

پیشاپیش از راهنماییتون تشکر میکنم

c-sharp_South
جمعه 02 تیر 1391, 18:12 عصر
نمیشه بعد از اجرای برنامه . برنامه بیاد به طور مخفی در یک مسیر از ویندوز کپی بشه و اون مسیر توی startup قرار بگیره؟

c-sharp_South
جمعه 02 تیر 1391, 20:01 عصر
کسی جواب این رو نمیدونه؟

hunter_ara
جمعه 02 تیر 1391, 20:52 عصر
نمیشه بعد از اجرای برنامه . برنامه بیاد به طور مخفی در یک مسیر از ویندوز کپی بشه و اون مسیر توی startup قرار بگیره؟

چون برنامه در حال اجراست امكانش وجود نداره (فايل باز و در حال استفادست)
ضمن اين كه اصلا درست و منطقي نيست!
راهي كه دوستمون اشاره كردن بهترين راهه!
چون هر بار مسير برنامه و اسمش تو رجيستري آپديت ميشه.
البته چيزي كه شما ميگين در حالت عادي و يه يوزر نرمال اتفاق نمي افته
ولي بابت فكر قشنگ و ايده ي خلّاقانتون بهتون تبريك ميگم!
من خودم هميشه مسير رجيستري رو دايناميك ميگرفتم و اسم برنامه رو بهش اضافه ميكردم و به اين فكر نكرده بودم كه ممكنه يوزر اسم برنامه رو هم عوض كنه!

Mahmoud.Afrad
جمعه 02 تیر 1391, 22:34 عصر
کپی که میشه گرفت. اصلا وقتی برنامه در حال اجرا رو بشه تغییر نام داد کپی گرفتن ازش دیگه مشکلی نیست(ویندوز این اجازه رو میده)
private static List<string> temp;
private static string desPath;
private void button3_Click(object sender, EventArgs e)
{
temp = Environment.SystemDirectory.Split('\\').ToList();
desPath = temp[0] + "\\" + temp[1] + "\\" + Application.ExecutablePath.Split('\\').Last();
if (!File.Exists(desPath))
{
File.Copy(Application.ExecutablePath, desPath);
File.SetAttributes(desPath, FileAttributes.Hidden);
}

Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true).SetValue(Application.ExecutablePath.Split('\ \').Last().Split('.').First(), desPath, RegistryValueKind.String);
temp.Clear();
temp = null;
desPath = null;
}این کدها فایل اجرایی برنامه رو در پوشه windows کپی میکنه و کلیدرجیستری رو هم ایجاد میکنه.

c-sharp_South
جمعه 02 تیر 1391, 22:59 عصر
کد مشکل نداره و بدون ارور باز میشه ولی وقتی که دارم Button رو میزنم که عملیاتش انجام بشه این ارور رو میده که توی عکس مشخصه کامل:
http://s3.picofile.com/file/7416437632/startuppp.jpg (http://s3.picofile.com/file/7416437632/startuppp.jpg)
این هم لینک عکس:
http://s3.picofile.com/file/7416437632/startuppp.jpg
خدایا این مشکلم حل بشه :ناراحت:

c-sharp_South
پنج شنبه 08 تیر 1391, 08:58 صبح
کپی که میشه گرفت. اصلا وقتی برنامه در حال اجرا رو بشه تغییر نام داد کپی گرفتن ازش دیگه مشکلی نیست(ویندوز این اجازه رو میده)
private static List<string> temp;
private static string desPath;
private void button3_Click(object sender, EventArgs e)
{
temp = Environment.SystemDirectory.Split('\\').ToList();
desPath = temp[0] + "\\" + temp[1] + "\\" + Application.ExecutablePath.Split('\\').Last();
if (!File.Exists(desPath))
{
File.Copy(Application.ExecutablePath, desPath);
File.SetAttributes(desPath, FileAttributes.Hidden);
}

Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run", true).SetValue(Application.ExecutablePath.Split('\ \').Last().Split('.').First(), desPath, RegistryValueKind.String);
temp.Clear();
temp = null;
desPath = null;
}این کدها فایل اجرایی برنامه رو در پوشه windows کپی میکنه و کلیدرجیستری رو هم ایجاد میکنه.

کسی میدونه چطور میشه مسیر کپی شدن فایل رو عوض کرد که دیگه نیازی به run as administrator نباشه؟

Mahmoud.Afrad
پنج شنبه 08 تیر 1391, 10:04 صبح
مثلا به چه مسیری میخوای تغییر بدی؟

c-sharp_South
پنج شنبه 08 تیر 1391, 10:22 صبح
مثلا به چه مسیری میخوای تغییر بدی؟

مثلا این مسیر:

Directory.CreateDirectory("C:\\win\\ib\\pictures");
DirectoryInfo dj = new DirectoryInfo(@"C:\win\ib\pictures");
DirectoryInfo dm = new DirectoryInfo(@"C:\win\ib");
DirectoryInfo di = new DirectoryInfo(@"C:\win");
di.Attributes = FileAttributes.Hidden;
اومدم این رو گذشتم توی form load که به محض اجرا شدن بیاد توی درایو c پوشه هایی که مشخص شده رو بسازه.
حالا میخوام برنامه به مسیر picture کپی بشه و از اونجا بره توی startup.
اینجوری فکر نکنم نیازی به run as adminitsrator داشته باشه.
اگه باز هم کلا توی درایو C همه قسمت هاشو نیاز به run as administrator داشت مشکلی نداره ، میشه همین مسیر رو به درایو d تغیر داد.
d:\\win\\ib\\pictures
اصلا خودتون چه مسیری رو پیشنهاد میکنین که نیازی به استفاده از کدی که من در بالا کردم نباشه و برنامه بدون run as adminisrator کاری که میخوام رو انجام بده؟
یعنی برنامه رو یک جا کپی کنه و از اون مسیر بزاره توی رجستری.

Mahmoud.Afrad
پنج شنبه 08 تیر 1391, 10:32 صبح
کافیه به جای desPath همین مسیر @"C:\win\ib\pictures" رو قرار بدید. به همین راحتی