PDA

View Full Version : آموزش: نحوه Run as administrator کردن Exe برنامه (بدون UAC Prompt)



nPad.Net
شنبه 01 آبان 1389, 19:28 عصر
کاربرد:بیشتر برا برنامه های تحت شبکه استفاده میشه که قراره با دسترسی admin برنامه ای رو روی user محدود شده اجرا کنیم!(اون user ی که استفاده میکنید میتونه admin هم نباشه)

تابع اصلی CreateProcessWithLogonW از advapi32.dll می باشد...





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace ConsoleApplication1
{

class Program

{
publicconstUInt32 Infinite = 0xffffffff;
publicconstInt32 Startf_UseStdHandles = 0x00000100;
publicconstInt32 StdOutputHandle = -11;
publicconstInt32 StdErrorHandle = -12;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
publicstructStartupInfo
{
publicint cb;
publicString reserved;
publicString desktop;
publicString title;
publicint x;
publicint y;
publicint xSize;
publicint ySize;
publicint xCountChars;
publicint yCountChars;
publicint fillAttribute;
publicint flags;
publicUInt16 showWindow;
publicUInt16 reserved2;
publicbyte reserved3;
publicIntPtr stdInput;
publicIntPtr stdOutput;
publicIntPtr stdError;
}
internalstructProcessInformation
{
publicIntPtr process;
publicIntPtr thread;
publicint processId;
publicint threadId;


}
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]


publicstaticexternbool CreateProcessWithLogonW(


String userName,
String domain,
String password,
UInt32 logonFlags,
String applicationName,
String commandLine,
UInt32 creationFlags,
UInt32 environment,
String currentDirectory,
refStartupInfo startupInfo,
outProcessInformation processInformation);
[DllImport("kernel32.dll", SetLastError = true)]
publicstaticexternbool GetExitCodeProcess(IntPtr process, refUInt32 exitCode);
[DllImport("Kernel32.dll", SetLastError = true)]
publicstaticexternUInt32 WaitForSingleObject(IntPtr handle, UInt32 milliseconds);
[DllImport("Kernel32.dll", SetLastError = true)]
publicstaticexternIntPtr GetStdHandle(IntPtr handle);
[DllImport("Kernel32.dll", SetLastError = true)]
publicstaticexternbool CloseHandle(IntPtr handle);
[STAThread]
staticvoid Main(string[] args)
{
StartupInfo startupInfo = newStartupInfo();
startupInfo.reserved = null;
startupInfo.flags &= Startf_UseStdHandles;
startupInfo.stdOutput = (IntPtr)StdOutputHandle;


startupInfo.stdError = (IntPtr)StdErrorHandle;

UInt32 exitCode = 123456;

ProcessInformation processInfo = newProcessInformation();

String command = @"C:\Windows\System\myApp.exe";// exe morede nazar
String user = "admin";
String domain = System.Environment.MachineName;
String password = "123";
String currentDirectory = System.IO.Directory.GetCurrentDirectory();
try
{
CreateProcessWithLogonW(
user,domain,password,(UInt32)1,command,command,
(UInt32)0,
(UInt32)0,
currentDirectory,
ref startupInfo,
out processInfo);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("Running ...");
WaitForSingleObject(processInfo.process, Infinite);
GetExitCodeProcess(processInfo.process, ref exitCode);
Console.WriteLine("Exit code: {0}", exitCode);
CloseHandle(processInfo.process);
CloseHandle(processInfo.thread);
}
}

}




موفق باشید

cardano7
دوشنبه 03 آبان 1389, 06:37 صبح
سلام
لطفا:
1- واضح توضیح بدید که صورت مسئله چیه. این کد چی کار می کنه؟
2- کد را با فرمت منظم اینجا قرار بدید که خوانا باشه.

ممنون

nPad.Net
سه شنبه 04 آبان 1389, 00:24 صبح
1- واضح توضیح بدید که صورت مسئله چیه. این کد چی کار می کنه؟
2- کد را با فرمت منظم اینجا قرار بدید که خوانا باشه.

ممنون
سلام

1-از این واضح تر:متفکر: (حتما دیدید که وقتی روی برنامه(exe برنامه) راست کلیک میکنیم دومین گزینه همین گزینه Run as هستش که میتونید برنامتونو تحت دسترسی user های دیگه اجراکنید.به اون دیالوگی که بعد از زدن Run as ظاهر میشه UAC-User Account control میگن)

2-ویرایش شد(دلیل : کمبود وقت در ارسال مطلب)

موفق باشید!