直白想方便的拍卖CCProxy代理的帐号管理,但一个最费力的题目就是帐号的更新

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

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;  

以不同用户身份运行程序

(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;  

 http://www.cnblogs.com/-clq/archive/2012/01/19/2326263.html

 

3楼 likang0712 2012-02-02 11:58发表 [回复]
谢谢 🙂

2楼 santalence 2009-05-23 17:29发表 [回复]
其一办法确实很好,to aguiwang :解决 GetSaveFileName
的题目,可在调用CreateProcessAsUser前调用下边这多少个函数:
BOOL LoadProfile(HANDLE hToken, LPTSTR lpszUserName)
{
BOOL bRet = FALSE;

PROFILEINFO pi;
pi.dwSize = sizeof(PROFILEINFO);
pi.dwFlags = 0;
pi.lpUserName = lpszUserName;
pi.lpDefaultPath = NULL;
pi.lpPolicyPath = NULL;
pi.lpServerName = NULL;
pi.lpProfilePath = NULL;

bRet = ::LoadUserProfile(hToken, &pi);

return bRet;
}

里面的lpszUsername 就是当下登陆用户名

1楼 aguiwang 2006-08-30 09:00发表 [回复]
idAnts的不二法门很好,但诸如此类从服务里用CreateProcessAsUser创制的经过,依然有调用者的性质.比如在创设出来的历程里弹出Save
file的common dialog是(即调用API
GetSaveFileName),上边的桌面和本身的文件夹如故Local瑟维斯下的,而不是当下登陆用户下的.而Localservice又尚未桌面和我的文件夹目录,所以在甄选桌面和自身的文本夹时common
dialog会并发这么的荒唐提醒错误.C:/documents and
settings/localservice/desktop refers to a location that is unavailable.
It could be on a hard drive on this computer,on a network, or on a
different computer on your home network. Check to make sure that the
disk is properly inserted, or that you are connected to the Internet or
home network, and then try again.

 

相关文章