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,WinExec,CreateProcess和CreateProcessAsUser的区别,待研究后在发表。
- ATL服务程序启动界面问题
- VC 2010+ATL:ATL服务程序无法启动
- ATL服务程序
- iphone程序启动界面问题
- iphone程序启动界面问题
- Atl 编写windows服务程序
- Qt 程序启动界面字体大小问题
- 在服务中启动带有界面的程序
- 在服务中启动带有界面的程序
- 在服务中启动带有界面的程序
- ATL服务程序使用CString类型
- vs2010 ATL创建windows服务程序
- vs2008 创建ATL服务程序bug解决方法
- android 程序启动界面
- 程序启动界面
- 程序启动界面
- java程序启动界面
- c# windows服务 启动外部程序,程序已开启,但看不到界面
- 堆和栈的区别
- hdu 4339 线段树 单点更新
- ios提交应用的问题
- tls回调
- 【SQL Server学习笔记】SQL Server查询性能调优、捕捉和评估查询性能
- ATL服务程序启动界面问题
- HibernateUtil类(韩顺平Hibernate视频)
- C#学习笔记
- Java定时任务ScheduledThreadPoolExecutor
- 判断一文件是不是字符设备文件
- c写了个通用链表带了例子。
- HDU 敌兵布阵 树状数组
- hdu 4331 Image Recognition(DP+线段树)2012 Multi-University Training Contest 4
- echo colorful text in shell.