ShellExecuteEx提升子进程权限
发布时间:2018年2月6日 作者:未知 查看次数:335
ShellExecuteEx提升子进程权限 ShellExecuteEx函数原型 BOOL ShellExecuteEx( _Inout_ SHELLEXECUTEINFO *pExecInfo );
SHELLEXECUTEINFO结构: typedef struct _SHELLEXECUTEINFO { DWORD cbSize; //这个是结构体大小,sizeof下SHELLEXECUTEINFO就行 ULONG fMask; HWND hwnd; //主进程的窗口句柄,一般没用 LPCTSTR lpVerb; //设置成runas就可以以管理员身份运行了,其他的都是普通用户身份 LPCTSTR lpFile; //要运行的文件 LPCTSTR lpParameters; //要运行的文件的参数 LPCTSTR lpDirectory; int nShow; //设置窗口显示(SW_SHOW)和不显示(SW_HIDE),当然还有其他的 HINSTANCE hInstApp; LPVOID lpIDList; LPCTSTR lpClass; HKEY hkeyClass; DWORD dwHotKey; union { HANDLE hIcon; HANDLE hMonitor; } DUMMYUNIONNAME; HANDLE hProcess; //返回子进程句柄 } SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO; 通过系统API ShellExecuteExW函数提权,向其参数lpVerb传入一个“runas”命令提权(出现UAC提示框) (http://lgy-047.blog.163.com/blog/static/613465652013924102256476/) SHELLEXECUTEINFO si; si.cbSize = sizeof(si); si.fMask = 0; si.hwnd = NULL; si.lpVerb = _T("runas");//关键是这里,不是一般的open。 si.lpFile = _T("Proc.exe");//指定要调用的程序 si.lpParameters = strCmd;//设置参数 si.lpDirectory = path; si.nShow = SW_SHOWNORMAL; si.hInstApp = NULL; si.lpIDList = NULL; si.lpClass = NULL; si.hkeyClass = NULL; si.dwHotKey = 0; si.hIcon = NULL; si.hProcess = NULL; ShellExecuteEx(&si); ====================================== win7中的Uac与开机自动启动 https://www.cnblogs.com/findumars/p/4718995.html 给Exe加上Uac的方法,在使用的过程中我们会发现,如果把带Uac的Exe写入注册表的Run中,是无法实现开机自动启动的,原因就是带Uac的exe需要申请管理员权限,以便运行执行程序,而在开机时无法申请到管理员权限,Exe将无法正常启动。那么如何使带Uac的Exe开机自动启动呢。 unit DyjStartMainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ShellAPI; const WM_STARTCLOSE = WM_USER + 100; type TFrmDyjStart = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } protected procedure WMStartClose(var Msg: TMessage); message WM_STARTCLOSE; public { Public declarations } end; var FrmDyjStart: TFrmDyjStart; implementation {$R *.dfm} procedure TFrmDyjStart.FormCreate(Sender: TObject); begin PostMessage(Self.Handle, WM_STARTCLOSE, 0, 0); end; procedure TFrmDyjStart.WMStartClose(var Msg: TMessage); var _vPathExe : string; begin _vPathExe := ExtractFilePath(Application.ExeName) + 'Dyj2.exe'; ShellExecute(0, 'runas', PChar(_vPathExe), nil, nil, SW_SHOWNORMAL); Application.Terminate; end; end. -------------------------------------------- 还可以使用services的方式来实现: -------------------------------------------- 在网上找资料,发现有几种方法: 通过系统API ShellExecuteExW函数提权,向其参数lpVerb传入一个“runas”命令(注:该命令是微软的一个隐藏参数),可以实现开机启动,并出现UAC提示框,但软件起来后,一些功能无法正常使用(实测:上面的例子就是弹出一个UAC对话框,需要点击后方可运行,运行后没发现有什么功能限制); -------------------------------------------- 对于Win7开机自启动,就是你们说的方法。我想提醒一点,恶意软件会破坏我们的“监控软件”,使其不能开机自启动。
|
|
|