在服务中启动带有界面的程序

      开发中有时会遇到这样的问题,当服务程序需要使用某些功能时,由于用户的关系而受到限制,比如访问注册表的HKEY_CURRENT_USER键,使用网络等等,这时候就需要以当前登陆用户的身份去进行操作,通常会创建一个进程来完成需要的功能。如果使用CreateProcess来创建进程的话,新创建的进程和服务程序依然是相同的用户身份,还是无法达到目的,只有使用CreateProcessAsUser了。但CreateProcessAsUser的第一个参数是HANDLE hToken,该参数通常应该用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  else
68  {
69   OutputDebugString("CreateProcessAsUser false!\r\n");
70  }
71  return bResult;
72 }

这样就可以以登陆用户的身份来运行程序了。

转载自:http://blog.csdn.net/idAnts/archive/2005/04/14/347879.aspx

posted on 2012-07-23 10:49  caiguangwen1  阅读(537)  评论(0编辑  收藏  举报

导航