在system用户下创建普通用户进程

Windows开发--------在System身份的程序下,使用其他用户的身份启动程序

本文主要通过CreateProcessAsUser()函数来在某用户的身份下启动进程。

根据进程来获取用户的token,需要一个本地的进程

方法一

步骤一:获取本地进程的token

/********************
参数解释:参数一:要获取的进程的进程名,比如notepad++.exe
		参数二:传出参数,传出所传入进程的token
返回值:反正有错就返回假,成功获取token就返回真
*********************/
bool GetProcessToken(TCHAR *pName,HANDLE &hToken)
{
	DWORD dwProcessID;
	DWORD dwTerminalSrvSessionID = 0;
	HANDLE hProcess = NULL;
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (INVALID_HANDLE_VALUE == hSnapshot) {
		return NULL;
	}
	PROCESSENTRY32 pe = { sizeof(pe) };
	for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe)) {
		if (lstrcmpi(pe.szExeFile, pName) == 0) {
			CloseHandle(hSnapshot);
			dwProcessID = pe.th32ProcessID;
			break;
		}
	}
	CloseHandle(hSnapshot);
	hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
	if( NULL == hProcess){
		return false;
	}
		
	if( !OpenProcessToken(hProcess,TOKEN_ALL_ACCESS, &hToken) )
	{
		return false;
	}
		
	DWORD dwLen;
	if( !GetTokenInformation(hToken, TokenSessionId, &dwTerminalSrvSessionID, sizeof(DWORD), &dwLen) )
	{
		return false;
	}
	return true;

}

步骤二:根据获取到的token来创建进程

void RestartControlProcess(TCHAR *m_ControlFilePath,HANDLE hToken)
{
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory(&si, sizeof(STARTUPINFO));
	si.cb = sizeof(STARTUPINFO);
	si.lpDesktop = TEXT("winsta0\\default");
	ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
	PVOID lpEnv;
	if (!CreateEnvironmentBlock(&lpEnv, hToken, FALSE) ) {
	}
	USES_CONVERSION;
	if (!CreateProcessAsUser(hToken,NULL,m_ControlFilePath,NULL,NULL,false,CREATE_UNICODE_ENVIRONMENT |DETACHED_PROCESS,lpEnv,NULL,&si,&pi))
	{
		return;
	}
	CloseHandle(pi.hThread);

}

方法二

在已知用户名和密码的情况下,使用LogonUser的方法在该用户下创建进程
参考于system用户进程或服务进程以特定用户启动其他程序的处理

有什么问题可以在评论区讨论

发布了2 篇原创文章 · 获赞 0 · 访问量 58

猜你喜欢

转载自blog.csdn.net/sinat_38602176/article/details/103297375