PDA

View Full Version : سوال: اجرای برنامه در حالت ادمین



daneshjoo2
شنبه 30 مرداد 1389, 14:13 عصر
باسلام
من یه برنامه دارم که برای اجرای صحیح در ویندوز ویستا و سون باید حتما در حالت run as administrator اجرا بشه.
راه حلی داره که این کار به صورت پیش فرض انجام بشه و نیازی به انتخاب کاربر نباشه؟

sinashahab
شنبه 30 مرداد 1389, 15:05 عصر
نه خیر دوست عزیز فکر نمیکنم هیچ راهی باشه .
اگه بود که همون اول هکرها دورش میزدن :لبخند:
ولی این هم یه نمونه هست که از Vista API استفاده کرده :
http://www.codeproject.com/KB/vista/Certified_for_Vista.aspx

s.khoshfekran
شنبه 30 مرداد 1389, 15:19 عصر
http://www.enusbaum.com/blog/2007/08/26/how-to-run-your-c-application-as-administrator-in-windows-vista/

daneshjoo2
شنبه 30 مرداد 1389, 15:25 عصر
نه خیر دوست عزیز فکر نمیکنم هیچ راهی باشه .
اگه بود که همون اول هکرها دورش میزدن :لبخند:
ولی این هم یه نمونه هست که از Vista API استفاده کرده :
http://www.codeproject.com/KB/vista/Certified_for_Vista.aspx
مرسی از جوابتون
ولی منظورم دور زدن این مکانیزم نبود، در هر صورت ویندوز از شما می پرسه که اجازه اجرا می دید یا نه!(در صورت تنظیم بودن UAC)
اتفاقا خیلی از برنامه ها هستن که رو ویندور 7 یا ویستا به محض اجرا این سؤالو ویندوز از کاربر میپرسه. و به طور اتوماتیک کنار آیکون برنامه یه علامت ادمین می ذاره یعنی به ویندوز شناسونده شده که باید در حالت ادمین اجرا شه...مثل برنامه cpu-z که اطلاعات سخت افزاری سیستم رو میده.
منم دقیقا میخوام برنامه همین جوری اجرا بشه، یعنی هر سری کاربر مجبور نشه راست کلیک و در نهایت run as administrator رو انتخاب کنه.
چون اگه دسترسی ادمین نداشته باشم بعضی از آدرس های رجیستری برام قابل دسترسی نیستن. پس فکر کنم یه مشکل معمول باشه که با دستکاری فایل exe برنامه قابل حل باشه.
بازم ممنون از پاسختون :)

daneshjoo2
شنبه 30 مرداد 1389, 15:32 عصر
http://www.enusbaum.com/blog/2007/08/26/how-to-run-your-c-application-as-administrator-in-windows-vista/

مرسی
احتمالا جواب صحیح باشه... هنور رو windows7 تستش نکردم. جوابشو اینجا میذارم.
قبلا این لینکو پیدا نکرده بودم، دست به سرچتون خوبه ها:لبخند:
ممنون از راهنماییتون

r00tkit
شنبه 30 مرداد 1389, 15:47 عصر
سلام

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

اینم امتحان کن


static void Main (string[] args)
{
ProcessStartInfo p=new ProcessStartInfo("cmd");
p.Verb="runas";

Process d = new Process();

d.StartInfo = p;
d.Start();

}

daneshjoo2
شنبه 30 مرداد 1389, 16:28 عصر
سلام

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

اینم امتحان کن


static void Main (string[] args)
{
ProcessStartInfo p=new ProcessStartInfo("cmd");
p.Verb="runas";

Process d = new Process();

d.StartInfo = p;
d.Start();

}


مرسی از پاسختون
این راه حلو قبلا تو stackoverflow دیده بودم ولی به هر شکلی اجرا کردم تحت admin اجرا نشد. ولی باز در اون صورت باید برنامه رو از مسیر دیگه ای call می کرد که جالب نبود.
باز به نظرم همون شناسوندنش به ویندوز بهترین راه باشه.

daneshjoo2
شنبه 30 مرداد 1389, 16:55 عصر
دوستان من روش های فوق رو تست کردم و بهترین راهو میزارم اینجا تا قابل استفاده برای دوستان دیگه هم باشه:
ابتدا روی اسم پروزه تو VS راست کلیک کرده و Add new item رو انتخاب کنید.
بعد گزینه application manifest file رو انتخاب کرده و Add کنید.
سپس مقدار asInvoker را در:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />
با requireAdministrator جا به جا کنید. یعنی:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
پروژه رو rebuild کنید، اگه همه چیز درست باشه کنار icon برنامه یه عکس میاد که نشون میده برنامه تحت admin باید اجرا بشه.
تست شده در ویندوز سرور 2008، ویندوز ویستا و سون.
با تشکر از تمام دوستان به خصوص آقا/خانم khoshfekran (http://barnamenevis.org/forum/member.php?u=142033)

r00tkit
شنبه 30 مرداد 1389, 18:57 عصر
سلام دوباره

توضیح های بیش تر در مورد روش قبل (http://msdn.microsoft.com/en-us/library/bb756929.aspx)


دوست من برای تفریح هم شده اینم یه روش دیگه:



public static class UAC {
public static bool AmElevated(){
return new WindowsPrincipal(WindowsIdentity.GetCurrent())
.IsInRole(WindowsBuiltInRole.Administrator);
}
public static void Elevate(){
if(AmElevated()) return;
ShellExecute(IntPtr.Zero, "runas\0",
Application.ExecutablePath + "\0", "\0", "\0", 1);
}
}

...

public class Program {
public static void Main(){
if(!UAC.AmElevated()){
MessageBox.Show("I'm not elevated, asking you to elevate...");
UAC.Elevate();
}else{
MessageBox.Show("I'm elevated, yays!");
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1());
}

منبع (http://channel9.msdn.com/posts/DanielMoth/Build-UAC-aware-apps-with-VS2008/) رو حتما" نگاه کن بدرد می خوره چیزای دیگه هم توش هست