ShellExecuteEx完美封装,程序提权执行,脚本vbs、bat、exe均可执行

bool shellExcute(const QString& path, const QString& paramater, bool admin_flag, bool wait_flag)
{
	std::wstring file_path = std::wstring((const wchar_t*)file_path.utf16());//绝对路径
	std::wstring paramater_line = std::wstring((const wchar_t*)paramater.utf16());
	SHELLEXECUTEINFO shell_exec_info = { 0 };
	shell_exec_info.cbSize = sizeof(SHELLEXECUTEINFO);
	shell_exec_info.fMask = SEE_MASK_NOCLOSEPROCESS;
	shell_exec_info.hwnd = NULL;
	if (admin_flag)
	{
		shell_exec_info.lpVerb = TEXT("runas");//提权
	}
	else
	{
		shell_exec_info.lpVerb = NULL;//不提权
	}
	shell_exec_info.lpFile = file_path.c_str();//调用文件位置
	shell_exec_info.lpParameters = paramater_line.c_str();//调用参数
	shell_exec_info.lpDirectory = NULL;
	shell_exec_info.nShow = SW_HIDE;//隐藏窗口执行
	shell_exec_info.hInstApp = NULL;
	if (!ShellExecuteEx(&shell_exec_info))
	{
		printf("Error: ShellExecuteEx failed 0x%x\n", GetLastError());//提取报错信息
		return false;
	}
	if (wait_flag)
	{
		DWORD dw = WaitForSingleObject(shell_exec_info.hProcess, INFINITE);//等待新开程序执行完成
		if (dw == WAIT_OBJECT_0)
		{
			qDebug() << "结束";
		}
		if (dw == WAIT_TIMEOUT)
		{
			qDebug() << "超时";
		}
		if (dw == WAIT_FAILED)
		{
			qDebug() << "无效";
		}
	}
	return true;
}
//ShellExecuteEx的执行只能得到返回状态码,得不到返回值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值