以不一样用户身份运维程序

(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网页,Computer卡死,用经过管理器查看时意识展开了多少个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;  

 

 

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),上边包车型地铁桌面和本身的文件夹依然LocalService下的,并不是现阶段登录用户下的.而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.

 

1.    #include <Windows.h>

2.    #include <tchar.h>

3.    #include <TlHelp32.h>

4.   

5.    BOOL LoadRemoteDll(DWORD dwProcessId,LPTSTR lpszLibName);

6.    DWORD EnablePrivilege (PCSTR name);

7.    BOOL GetProcessIdByName(LPSTR szProcessName, LPDWORD lpPID);

8.   

9.    DWORD EnablePrivilege (PCSTR name)

10.   {

11.       HANDLE hToken;

12.       BOOL rv;

13.       TOKEN_PRIVILEGES priv = { 1, {0, 0, SE_PRIVILEGE_ENABLED}
};

14.       LookupPrivilegeValue (

15.           0,

16.           name,

17.           &priv.Privileges[0].Luid

18.           );

19.       OpenProcessToken(

20.           GetCurrentProcess (),

21.           TOKEN_ADJUST_PRIVILEGES,

22.           &hToken

23.           );

24.       AdjustTokenPrivileges (

25.           hToken,

26.           FALSE,

27.           &priv,

28.           sizeof priv,

29.           0,

30.           0

31.           );

32.       rv = GetLastError();

33.       CloseHandle (hToken);

34.       return rv;

35.   }

36.  

37.   BOOL GetProcessIdByName(LPSTR szProcessName, LPDWORD lpPID)

38.   {

39.       STARTUPINFO st;

40.       PROCESS_INFORMATION pi;

41.       PROCESSENTRY32 ps;

42.       HANDLE hSnapshot;

43.       ZeroMemory(&st, sizeof(STARTUPINFO));

44.       ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

45.       st.cb = sizeof(STARTUPINFO);

46.       ZeroMemory(&ps,sizeof(PROCESSENTRY32));

47.       ps.dwSize = sizeof(PROCESSENTRY32);

48.  

49.       hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);

50.       if(hSnapshot == INVALID_HANDLE_VALUE)

51.       {

52.           return FALSE;

53.       }

54.  

55.       if(!Process32First(hSnapshot,&ps))

56.       {

57.           return FALSE;

58.       }

59.       do

60.       {

61.  

62.           if(lstrcmpi(ps.szExeFile,”explorer.exe”)==0)

63.           {

64.  

65.               *lpPID = ps.th32ProcessID;

66.               CloseHandle(hSnapshot);

67.               return TRUE;

68.           }

69.       }

70.       while(Process32Next(hSnapshot,&ps));

71.  

72.       CloseHandle(hSnapshot);

73.       return FALSE;

74.   }

75.  

76.   BOOL LoadRemoteDll(DWORD dwProcessId,LPTSTR lpszLibName){

77.       BOOL bResult = FALSE;

78.       HANDLE hProcess = NULL;

79.       HANDLE hThread = NULL;

80.       PSTR pszLibFileRemote = NULL;

81.       DWORD cch;

82.       PTHREAD_START_ROUTINE pfnThreadRtn;

83.  

84.       __try{

85.           hProcess =
OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);

86.           if(hProcess == NULL){

87.               __leave;

88.           }

89.           cch = 1 + lstrlen(lpszLibName);

90.           pszLibFileRemote =
(PSTR)VirtualAllocEx(hProcess,NULL,cch,MEM_COMMIT,PAGE_READWRITE);

91.           if(pszLibFileRemote == NULL){

92.               __leave;

93.           }

94.          
if(!WriteProcessMemory(hProcess,(LPVOID)pszLibFileRemote,(LPVOID)lpszLibName,cch,NULL)){

95.               __leave;

96.           }

97.           pfnThreadRtn =
(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT(“Kernel32”)),TEXT(“LoadLibraryA”));

98.           if(pfnThreadRtn == NULL){

99.               __leave;

100.        }

101.        hThread =
CreateRemoteThread(hProcess,NULL,0,pfnThreadRtn,(PVOID)pszLibFileRemote,0,NULL);

102.        if(hThread == NULL){

103.            __leave;

104.        }

105.        WaitForSingleObject(hThread,INFINITE);

106.        bResult = TRUE;

107.    }__finally{

108.        if(pszLibFileRemote != NULL){

109.           
VirtualFreeEx(hProcess,(PVOID)pszLibFileRemote,0,MEM_RELEASE);

110.        }

111.        if(hThread != NULL){

112.            CloseHandle(hThread);

113.        }

114.        if(hProcess != NULL){

115.            CloseHandle(hProcess);

116.        }

117.    }

118.    return bResult;

119.}

120.

121.int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR
lpCmdLine,int nCmdShow){

122.    DWORD dwPID;

123.    if(0!=EnablePrivilege(SE_DEBUG_NAME));

124.    return 0;

125.    if(!GetProcessIdByName(“explorer.exe”,&dwPID))

126.        return 0;

127.    if(!LoadRemoteDll(dwPID,”msg.dll”))

128.        return 0;

129.}

 

本文出自 “Pnig0s” 博客

  

. #include Windows.h 2. #include tchar.h 3.
#include TlHelp32.h 4. 5. BOOL LoadRemoteDll(DWORD dwProcessId,LPTSTR
lpszLibName); 6. DWORD EnablePrivilege (PCSTR name); 7. BOOL
GetP…

相关文章