windows 服务进程中调用UI进程

概述:

    Windows 服务程序的权限一般只是SYSTEM权限,而UI进程则需要Administrator权限才能正常显示,因此服务进程需要调用UI进程则需要进行提权处理.可使用CreateProcessAsUser 方法创建指定权限的应用程序。

    提权则需要获取对应权限令牌,一般explorer.exe进程的权限是Administrator,因此我们可以通过 explorer.exe进程获取Administraror权限。

具体实现方法如下:

//根据进程名称获取进程句柄

HANDLE GetProcessHandle(LPCTSTR szExeName)
{
	PROCESSENTRY32 Pc = { sizeof(PROCESSENTRY32) };
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
	if (Process32First(hSnapshot, &Pc)) {
		do {
			if (!_tcsicmp(Pc.szExeFile, szExeName)) {
				printf("explorer's PID=%d\n", Pc.th32ProcessID);
				return OpenProcess(PROCESS_ALL_ACCESS, TRUE, Pc.th32ProcessID);
			}
		} while (Process32Next(hSnapshot, &Pc));
	}
	return NULL;
}

//创建进程阻塞并返回进程句柄

bool ShellExecuteByAdmin(LPCTSTR strCommand, HANDLE* pProcessHandle)
{
	HANDLE hToken;
	HANDLE hExp = GetProcessHandle(_T("explorer.exe")); //获取进程 句柄
	if (hExp == NULL)
		return FALSE;

	OpenProcessToken(hExp, TOKEN_ALL_ACCESS, &hToken);
	if (hToken == NULL)
		return FALSE;
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.lpDesktop = (char *)("winsta0\\default");
	si.wShowWindow = SW_HIDE;
	si.dwFlags = STARTF_USESHOWWINDOW;

	TCHAR szParameter[256] = { 0 };
	lstrcat(szParameter, strCommand);

	char ScreenProtect[1024];
	memset(ScreenProtect, 0, sizeof(ScreenProtect));
	GetAbsoluteDirectory(ScreenProtect);
	strcat(ScreenProtect, "ScreenProtect.exe");

	if (CreateProcessAsUser(hToken, ScreenProtect, szParameter, NULL,
		NULL, FALSE, CREATE_NO_WINDOW | CREATE_NEW_CONSOLE | CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi)) //以administrator用户身份执行程序,CREATE_NO_WINDOW,CREATE_NEW_CONSOLE,CREATE_DEFAULT_ERROR_MODE
	{
		if (pi.hProcess != INVALID_HANDLE_VALUE)
		{
			WaitForSingleObject(pi.hProcess, INFINITE); //直到进程结束。可通过pProcessHandle 控制创建进程的生命周期。
		}
		CloseHandle(pi.hProcess);
		CloseHandle(pi.hThread);
	}
	CloseHandle(hToken);
	return 0;
}

不想通过阻塞方式的话,只需要将WaitForSingleObject去掉,自己在其他地方管理启动的进程即可

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值