若在服务中调用CreateProcess创建进程,则进程所属用户为System,而不是当前登录用户,这会导致一些问题,例如若程序含有UI界面,则无法显示出用户界面,所以若有此种问题,应创建当前登录用户下的进程,而Api CreateProcessAsUser提供了这种功能,以下为示例代码
void LaunchProcess()
{
HANDLE hToken;
//创建进程快照
PROCESSENTRY32 pe32 = { 0 };
pe32.dwSize = sizeof(pe32);
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hSnapShot!=0 && hSnapShot!=INVALID_HANDLE_VALUE)
{
BOOL bRet = Process32FirstW(hSnapShot,&pe32);
while(bRet)
{
if (_tcsicmp(pe32.szExeFile,L"Explorer.EXE") == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,pe32.th32ProcessID);
if (hProcess!=NULL)
{
BOOL flag = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);
CloseHandle(hProcess);
}
break;
}
bRet = Process32Next(hSnapShot,&pe32);
}
CloseHandle(hSnapShot);
}
STARTUPINFO si ={sizeof(si)};
PROCESS_INFORMATION pi;
BOOL bSuccess = CreateProcessAsUser(hToken,L"C:\\AgentGUI.exe",NULL,NULL,NULL,FALSE,NULL,
NULL,NULL,&si,&pi);
}