以分化用户身份运行程序

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


以不一样用户地方运营程序

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

直接想方便的拍卖CCProxy代理的帐号管理,所以指望做2个相比较好的管理工科具。但1个最麻烦的题材正是帐号的换代,CCProxy有二个网页管理成效,能够加帐号,但加的帐号便是不得以即时更新。傍早晨网的时候发现CCProxy有壹效应正是永葆命令行的操作,如:

  CCProxy
-reboot  重启软件

  CCProxy -reset  
更新配备

  CCProxy
-update  更新帐号

   

  
试着改了AccInfo.ini中帐号音讯,在DOS中运营CCProxy
-update的确更新了账号,所以开首用PHP做管理工科具,做到调用CCProxy
-update时,用了PHP中的exec(),system()等函数一贯没有效应,后又通过调用批处理公事来调用命令行参数都13分。 处理得正没耐心的时候,一气之下狂刷新PHP网页,电脑卡死,用经过管理器查看时发现打开了多少个CCProxy进程,认真一看,除了一个CCProxy是用户进度外别的CCProxy全是system进程。认真1想有非常的大只怕是运作用户位置分裂所产生的结果。

  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;