ShellExecuteEx提升子进程权限

56 篇文章 5 订阅
46 篇文章 2 订阅

首先说下ShellExecuteEx是如何提升权限的,ShellExecuteEx函数只有一个参数,就是SHELLEXECUTEINFO结构体,不过是指针类型的,这无所谓,关键是这个结构体中有一个参数lpVerb,它的作用就是指定如何操作文件lpFile,提升权限就是设置lpVerb为“runas”。


将lpVerb设定为”open”或NULL的时候,创建的子进程继承了主进程的权限,当主进程使用管理员身份运行时,经lpVerb设置为”open”或NULL时,就会发现创建的子进程依旧是管理员身份。


最终测试的结果是
(1).当主进程以管理员身份运行时,创建的子进程都是管理员身份;
(2).当主进程以普通用户身份运行时,若将lpVerb参数设置为“runas”,则创建的子进程是管理员身份;若将lpVerb设置为“open”或NULL时,则创建的子进程时普通用户身份。

函数原型
BOOL ShellExecuteEx(
  _Inout_  SHELLEXECUTEINFO *pExecInfo
);

结构:
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;


测试:
SHELLEXECUTEINFO ShExecInfo = {0};  
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);  
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;  
ShExecInfo.hwnd = NULL;  
ShExecInfo.lpVerb = L"runas";  
ShExecInfo.lpFile = L"cmd";  
ShExecInfo.lpParameters = L"";  
ShExecInfo.lpDirectory = NULL;  
ShExecInfo.nShow = SW_SHOW;  
ShExecInfo.hInstApp = NULL;  
ShellExecuteEx(&ShExecInfo);  
WaitForSingleObject(ShExecInfo.hProcess,INFINITE); 
         
运行结果可以明显看到,启动的cmd命令行窗口,的权限是不同的。


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt应用程序中提升管理员权限,可以使用QProcess类来启动一个新的进程并使用Windows API来提升权限。以下是一个示例代码: ```cpp #include <QCoreApplication> #include <QProcess> #include <windows.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建一个新的进程 QProcess process; process.setProgram("cmd.exe"); process.setArguments(QStringList() << "/C" << "echo hello world"); // 提升管理员权限 if (IsUserAnAdmin()) { process.setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments *args) { args->flags |= CREATE_NEW_CONSOLE; args->startupInfo->dwFlags &= ~STARTF_USESTDHANDLES; args->startupInfo->dwFlags |= STARTF_USESHOWWINDOW; args->startupInfo->wShowWindow = SW_NORMAL; args->startupInfo->lpDesktop = nullptr; args->startupInfo->cb = sizeof(STARTUPINFOEXW); args->lpAttributeList = nullptr; }); } else { // 如果当前用户不是管理员,则使用ShellExecute提升权限 SHELLEXECUTEINFO shexinfo = { 0 }; shexinfo.cbSize = sizeof(shexinfo); shexinfo.fMask = SEE_MASK_NOCLOSEPROCESS; shexinfo.lpFile = L"cmd.exe"; shexinfo.lpParameters = L"/C echo hello world"; shexinfo.nShow = SW_SHOW; shexinfo.lpVerb = L"runas"; ShellExecuteEx(&shexinfo); WaitForSingleObject(shexinfo.hProcess, INFINITE); CloseHandle(shexinfo.hProcess); return 0; } // 启动进程 process.start(); process.waitForFinished(); return a.exec(); } ``` 在这个示例中,如果当前用户是管理员,则使用QProcess启动一个新的进程,然后使用Windows API提升权限。如果当前用户不是管理员,则使用ShellExecuteEx提升权限。注意,使用ShellExecuteEx时需要等待进程完成才能退出应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值