ATL服务程序启动界面问题

来源:互联网 发布:苹果微信数据恢复软件 编辑:程序博客网 时间:2024/06/12 03:06
开发中有时会遇到这样的问题,当服务程序需要使用某些功能时,由于用户的关系而受到限制,比如访问注册表的HKEY_CURRENT_USER键,使用网络等等,这时候就需要以当前登陆用户的身份去进行操作,通常会创建一个进程来完成需要的功能。如果使用CreateProcess来创建进程的话,新创建的进程和服务程序依然是相同的用户身份,还是无法达到目的,只有使用CreateProcessAsUser了。但CreateProcessAsUser的第一个参数是HANDLEhToken,该参数通常应该用LogonUser来获得,但是LogonUser又需要用户名和用户密码,这样就很不现实。那应该怎么办呢?我想到了一个方法可以绕过LogonUser直接获得hToken。因为用户已经登陆,那么肯定有Shell(就是EXPLORER.EXE)运行了,我们可以通过遍历进程来取得Shell的hToken来运行进程。下面就是示例代码:
复制代码
 1 #include "tlhelp32.h" 2  3 BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName) 4 { 5  if(!lpName) 6  { 7   return FALSE; 8  } 9  HANDLE         hProcessSnap = NULL; 10  BOOL           bRet      = FALSE; 11  PROCESSENTRY32 pe32      = {0}; 12  13  hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 14     if (hProcessSnap == INVALID_HANDLE_VALUE) 15         return (FALSE); 16  17     pe32.dwSize = sizeof(PROCESSENTRY32); 18  19     if (Process32First(hProcessSnap, &pe32)) 20     {  21         do 22         {23           if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))24           {25              HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,26      FALSE,pe32.th32ProcessID);27              bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);28              CloseHandle (hProcessSnap); 29              return (bRet);30           }31         } 32         while (Process32Next(hProcessSnap, &pe32)); 33         bRet = TRUE; 34     } 35     else 36         bRet = FALSE;37  38     CloseHandle (hProcessSnap); 39     return (bRet);40 }41 42 BOOL RunProcess(LPCSTR lpImage)43 {44  if(!lpImage)45  {46   return FALSE;47  }48  HANDLE hToken;49  if(!GetTokenByName(hToken,"EXPLORER.EXE"))50  {51   return FALSE;52  }53  STARTUPINFO si;54  PROCESS_INFORMATION pi;55  56  ZeroMemory(&si, sizeof(STARTUPINFO));57  si.cb= sizeof(STARTUPINFO);58  si.lpDesktop = TEXT("winsta0\\default");59  60  BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL,61   FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);62  CloseHandle(hToken);63  if(bResult)64  {65   OutputDebugString("CreateProcessAsUser ok!\r\n");66  }67  else68  {69   OutputDebugString("CreateProcessAsUser false!\r\n");70  }71  return bResult;72 }关于ATL服务程序启动界面用到的方法:ShellExecute,WinExecCreateProcess和CreateProcessAsUser的区别,待研究后在发表。

原创粉丝点击