PDA

View Full Version : سوال: تغییر حالت اجرای نرم افزار



persia_hrn
چهارشنبه 10 آبان 1396, 13:35 عصر
با سلام خدمت اساتید محترم ,

آیا امکان این هست که نرم افزاری که به صورت نرمال اجرا شده در زمان اجرا به حالت Administrator تغییر وضعیت بده ؟ یعنی نرم افزار ابتداً به صورت نرمال اجرا بشه و در صورت نیاز وقتی اجرا هست به سطح Admin بره ؟

من خیلی جستجو کردم ولی چیزی پیدا نکردم ، امکان اجرای نرم افزار ابتداً به صورت RunAsAdministrator رو میدونم و مشکلی باهاش ندارم ولی به دلایلی نمیخوام از همون اول به صورت Admin اجرا بشه . اگر امکانش هست لطفاً یه راهنمایی بفرمائید ، اگر هم نه که اطلاع بدید ممنون میشم .

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

Mask
پنج شنبه 11 آبان 1396, 10:44 صبح
بله. شما میتونید برنامتون در ابتدا بصورت عادی و در بین راه بصورت ادمین باز نمایید.
برای این منظور کافیه هر زمان که نیاز به این مورد داشتید، برنامتون رو در مد ادمین باز کنید و برنامه جاری رو ببندید.
کدهای مورد نیاز در لینک زیر هست:
https://stackoverflow.com/questions/6814931/run-this-program-as-an-administrator-2-or-how-to-get-the-licence-uac-admin-duri

persia_hrn
پنج شنبه 11 آبان 1396, 12:28 عصر
جناب آقای Mask از توجهتون ممنونم

من یه برنامه نوشتم که توی اتوران اجرا میشه و در قسمتی از برنامه کدهای زیر رو نوشتم :

Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_CURRENT_USER;
if Reg.KeyExists('\Software\Microsoft\Windows\Current Version\Policies\Explorer\')=False then
begin
ShellExecute(Handle, 'runas', '.\CReg.exe', nil, nil, SW_SHOWNORMAL);
end
else
begin
Loop:=Reg.ReadInteger('NoDriveTypeAutoRun');
if Loop<>4 then ShellExecute(Handle, 'runas', '.\CReg.exe', nil, nil, SW_SHOWNORMAL);
end;

همونطور که میبینید در خط سوم کدبالا من شرطی رو گذاشتم که در صورت عدم وجود کلید رجیستری یه برنامه جانبی اجرا بشه و در غیر این صورت اگر کلید مورد نظر وجود داشت ، متغیر Loop رو مساوی Value مربوطه کنه و بعد چک کنه که اگر Value مخالف عدد 4 بود باز اون نرم افزار جانبی اجرا بشه .
کار اون نرم افزار جانبی اینه که اگر کلید یا Value بالا وجود نداشته باشه یا مغایر 4 باشه اون رو تغییر بده .

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

توی آدرسی که شما فرستادین و قبلاً مطالعش کرده بودم ، بررسی انجام میشه که UAC ویندوز فعال هست یا نه ؟ البته همون بررسی هم اگر برنامه در حالت نرمال اجرا بشه جواب غلط برمیگردونه !

به نظر شما مشکلم رو چطور میتونم حل کنم ؟

البته این توضیح رو بدم که برنامه اصلی رو بدلیل اینکه توی اتوران اجرا میشه نمیخوام در حالت ادمین اجرا کنم و همچنین نمیخوام UAC ویندوز رو غیر فعال کنم .

ممنون از توجه شما

Mask
جمعه 12 آبان 1396, 17:16 عصر
این کد:

uses ShellApi, ...;
function RunAsAdmin(const Handle: Hwnd; const Path, Params: string): Boolean;
var
sei: TShellExecuteInfoA;
begin
FillChar(sei, SizeOf(sei), 0);
sei.cbSize := SizeOf(sei);
sei.Wnd := Handle;
sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
sei.lpVerb := 'runas';
sei.lpFile := PAnsiChar(Path);
sei.lpParameters := PAnsiChar(Params);
sei.nShow := SW_SHOWNORMAL;
Result := ShellExecuteExA(@sei);
end;

procedure TFormMain.RunAddOrRemoveApplication;
begin
// Example that uses elevated rundll to open the Control Panel to Programs and features
RunAsAdmin(FormMain.Handle, 'rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl', '');
end;



این لینک
http://wiki.freepascal.org/Executing_External_Programs