有一个项目要求守护进程是用SYSTEM账户启动,监测主要运行的主程序,在当前登录的用户桌面上。 主程序是有窗口界面,如果直接CreateProcess在win7下不能看到界面或者会出现交互提示框,影响使用。
直接上代码吧!
#include <Wtsapi32.h>
#pragma comment(lib ,"Wtsapi32.lib")
#include <Userenv.h>
#pragma comment(lib,"Userenv.lib")
// 获得当前Session ID
DWORD dwSessionID = WTSGetActiveConsoleSessionId();
HANDLE hToken = NULL;
// 获得当前Session的用户令牌
// 复制令牌
HANDLE hDuplicatedToken = NULL;
// 创建用户Session环境
LPVOID lpEnvironment = NULL;
if (WTSQueryUserToken(dwSessionID, &hToken)==FALSE)
{
LOG_MINDER(_T("获取token失败!")+ GetErrorMessage(GetLastError()));
}
else if (DuplicateTokenEx(hToken,MAXIMUM_ALLOWED, NULL,
SecurityIdentification, TokenPrimary,&hDuplicatedToken)==FALSE )
{
LOG_MINDER(_T("复制token失败!")+ GetErrorMessage(GetLastError()));
}
else if (CreateEnvironmentBlock(&lpEnvironment, hDuplicatedToken, FALSE)==FALSE)
{
LOG_MINDER(_T("CreateEnvironmentBlock失败!")+ GetErrorMessage(GetLastError()));
}
else if(!CreateProcessAsUser(hToken,mainProcessFileName, _T(""), NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT,
lpEnvironment, NULL, &si, &pi))
{
tstring msg;
msg.format(_T("创建进程失败:%s %s"), mainProcessFileName.c_str(), GetErrorMessage(GetLastError()).c_str());
LOG_MINDER(msg);
}
else
{
LOG_MINDER(_T("创建进程成功!! 进程ID: %d, 线程ID: %d"), pi.dwProcessId, pi.dwThreadId );
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
//等待进程启动完成.
WaitForSingleObject( CService::mhServiceEvent, 5000 );
}
if (hToken != NULL)
{
CloseHandle(hToken);
}
if (hDuplicatedToken != NULL)
{
CloseHandle(hDuplicatedToken);
}
if (lpEnvironment != NULL)
{
DestroyEnvironmentBlock(lpEnvironment);
}