以不同用户地方运行程序

http://blog.sina.com.cn/s/blog\_65977dde0100s7tm.html


以不同用户地方运行程序

(2011-07-09 09:15:25)

直白想方便的拍卖CCProxy代理的帐号管理,所以指望做一个相比好的管理工具。但一个最麻烦的问题就是帐号的翻新,CCProxy有一个网页管理功能,能够加帐号,但加的帐号就是不得以及时更新。清晨上网的时候发现CCProxy有一意义就是永葆命令行的操作,如:

  CCProxy
-reboot  重启软件

  CCProxy -reset  
更新配备

  CCProxy
-update  更新帐号

   

  
试着改了AccInfo.ini中帐号信息,在DOS中运行CCProxy
-update的确更新了账号,所以最先用PHP做管理工具,做到调用CCProxy
-update时,用了PHP中的exec(),system()等函数平素尚未效果,后又经过调用批处理文件来调用命令行参数都相当。 处理得正没耐心的时候,一气之下狂刷新PHP网页,电脑卡死,用经过管理器查看时发现打开了多少个CCProxy进程,认真一看,除了一个CCProxy是用户进程外其他CCProxy全是system进程。认真一想有可能是运效能户身份各异所暴发的结果。

  Apache服务调用的表面程序以system身份运行,自己双击运行的先后以用户身份运行。 如果CCProxy
-update以用户身份运行是不是就可以了吧?本人在网络上找到了runas这多少个命令,的确可以指定以哪个用户运行,不过每便都要输密码,没有密码的帐
号就要抬高密码才足以用,“/savecred”这个参数可以用,只要输入一回密码就足以了,但在PHP中发觉要以system的地位输入两回才行,根本
没有机会输入。打算用C程序来拍卖这个问题。可是发现用WinExec(),ShellExecute(),CreateProcess()都不好处理这么些题目,好在发现了CreateProcessAsUser()这么些函数。把网络上的主次改了几处,编译后一试问题终于解决。

   以下为相关代码:

// Update.cpp :
定义控制台应用程序的入口点。

  1. #include “stdafx.h”  
  2. #include <windows.h>  
  3. #include <tlhelp32.h>  
  4.   
  5. BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)  
  6. {  
  7.     if(!lpName)  
  8.         return FALSE;  
  9.       
  10.     HANDLE         hProcessSnap = NULL;   
  11.     BOOL           bRet      = FALSE;   
  12.     PROCESSENTRY32 pe32      = {0};   
  13.       
  14.     hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   
  15.     if (hProcessSnap == INVALID_HANDLE_VALUE)   
  16.         return (FALSE);   
  17.       
  18.     pe32.dwSize = sizeof(PROCESSENTRY32);   
  19.       
  20.     if (Process32First(hProcessSnap, &pe32))   
  21.     {    
  22.         do   
  23.         {  
  24.             if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))  
  25.             {  
  26.                 HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,  
  27.                     FALSE,pe32.th32ProcessID);  
  28.                 bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);  
  29.                 CloseHandle (hProcessSnap);   
  30.                 return (bRet);  
  31.             }  
  32.         }   
  33.         while (Process32Next(hProcessSnap, &pe32));   
  34.         bRet = TRUE;   
  35.     }    
  36.     else   
  37.         bRet = FALSE;  
  38.       
  39.     CloseHandle (hProcessSnap);   
  40.     return (bRet);  
  41. }  
  42.   
  43. BOOL RunProcess(LPCSTR lpImage,LPSTR lpCommandLine)  
  44. {  
  45.     if(!lpImage)  
  46.         return FALSE;  
  47.       
  48.     HANDLE hToken;  
  49.     if(!GetTokenByName(hToken,”EXPLORER.EXE”))  
  50.         return FALSE;  
  51.       
  52.     STARTUPINFO si;  
  53.     PROCESS_INFORMATION pi;  
  54.       
  55.     ZeroMemory(&si, sizeof(STARTUPINFO));  
  56.     si.cb= sizeof(STARTUPINFO);  
  57.     si.lpDesktop = TEXT(“winsta0\\default”);  
  58.       
  59.     BOOL bResult = CreateProcessAsUser(hToken,lpImage, lpCommandLine,NULL,NULL,  
  60.         FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);  
  61.     CloseHandle(hToken);  
  62.     if(bResult)  
  63.     {  
  64.         OutputDebugString(“CreateProcessAsUser ok!\r\n”);  
  65.         printf(“CreateProcessAsUser ok!\r\n”);  
  66.     }  
  67.     else  
  68.     {  
  69.         OutputDebugString(“CreateProcessAsUse* **lse!\r\n”);  
  70.         printf(“CreateProcessAsUse* **lse!\r\n”);  
  71.     }  
  72.     return bResult;  
  73. }  
  74.   
  75. int _tmain(int argc, _TCHAR* argv[])  
  76. {  
  77.     RunProcess(“CCProxy.exe”,” -update”);  
  78.     return 0;  

相关文章