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用户进程或服务进程以特定用户启动其他程序的处理
有什么问题可以在评论区讨论