VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 759|回复: 1

[求助] vb6 管理员权限 启动 普通权限进程

[复制链接]
发表于 2019-7-23 10:03:10 | 显示全部楼层 |阅读模式
本帖最后由 elfkid 于 2019-7-23 10:21 编辑

还有大神在玩vb6吗?
写个自用的小程序,遇到一个问题:已经是管理员权限的进程,如何启动一个普通权限进程。就和explorer一样权限的普通进程。
查到的资料是调用DuplicateTokenEx,复制explorer.exe 进程的token,然后用CreateProcessWithTokenW启动新进程。原始代码是c++代码,可以成功。但是转成vb6后就死活不行,explorer.exe 的token可以复制成功,但是在启动新进程时候,调试好久都通不过。不知道哪个参数出问题了。
有大神可以给看看吧。

  1. Public Function getTokenbyName(strProcessName As String) As Long
  2.    
  3.     Dim PsSnap As Long
  4.     Dim PE32 As PROCESSENTRY32
  5.     Dim pHandl As Long
  6.     Dim Ltoken As Long
  7.     Dim NToken As Long
  8.     Dim PsName As String
  9.     Dim Sa As SECURITY_ATTRIBUTES
  10.     Dim i As Integer
  11.     PsSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
  12.     If PsSnap = INVALID_HANDLE_VALUE Then getTokenbyName = -1&
  13.     PE32.dwSize = Len(PE32)
  14.     If Process32First(PsSnap, PE32) Then
  15.         Do
  16.             i = InStr(1, PE32.szExeFile, Chr(0))
  17.             PsName = LCase(Left(PE32.szExeFile, i - 1))
  18.             If PsName = LCase(strProcessName) Then
  19.                 Debug.Print "the input ps name : " & PsName
  20.                 pHandl = OpenProcess(PROCESS_QUERY_INFORMATION, False, PE32.th32ProcessID)
  21. '                pHandl = OpenProcess(PROCESS_ALL_ACCESS, True, PE32.th32ProcessID)
  22.                 Debug.Print "the explorer id : " & PE32.th32ProcessID
  23. '                Debug.Print "the explorer name : " & PE32.szExeFile
  24.                 If pHandl <> 0 Then
  25.                     Dim re As Boolean
  26.                     re = OpenProcessToken(pHandl, TOKEN_DUPLICATE, Ltoken)
  27. '                    re = OpenProcessToken(pHandl, TOKEN_ALL_ACCESS, Ltoken)
  28.                         Debug.Print "open processtoken re>>" & re & "  return token >>" & Ltoken
  29.                         Debug.Print "open processtoken errcode: " & Err.LastDllError
  30.                     If re Then
  31.                         NToken = vbNull
  32.                         re = DuplicateTokenEx(Ltoken, TOKEN_ALL_ACCESS, Sa, SecurityImpersonation, TokenPrimary, NToken)

  33.                             Debug.Print "duplicatetoken re>> " & re & " new token>> " & NToken
  34.                             Debug.Print "duplicate operation errcode: " & Err.LastDllError
  35.                         CloseHandle Ltoken
  36.                     End If
  37.                     Exit Do
  38.                     CloseHandle pHandl
  39.                 End If

  40.             End If
  41.         Loop While (Process32Next(PsSnap, PE32))
  42.         getTokenbyName = IIf(re, NToken, -1&)
  43.     Else
  44.         getTokenbyName = -1&
  45.         CloseHandle PsSnap
  46.     End If
  47. End Function



  48. Public Function StartPswithToken(ByVal PsName As String) As Boolean
  49.     Dim hToken As Long
  50.     hToken = getTokenbyName("Explorer.exe")

  51.     Debug.Print "return new token is " & hToken
  52.     Dim PsInfo As PROCESS_INFORMATION
  53.     ZeroMemory PsInfo, Len(PsInfo)
  54.     Dim si As STARTUPINFO
  55.     ZeroMemory si, Len(si)
  56.     si.cb = Len(si)
  57.     si.wShowWindow = SW_SHOW
  58.     si.dwFlags = STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW
  59. '    si.lpDesktop = 0
  60.    
  61.     Dim sEnv As Variant
  62.    
  63.     If CreateEnvironmentBlock(sEnv, hToken, 0) Then sEnv = vbNullString
  64.    
  65.     Dim Cdir As String * MAX_PATH
  66.     GetCurrentDirectoryW Len(Cdir), Cdir
  67.    
  68.     Dim dwCreationFlag As Long
  69.     dwCreationFlag = NORMAL_PRIORITY_CLASS Or CREATE_UNICODE_ENVIRONMENT Or CREATE_NEW_CONSOLE
  70.     Dim RetV As Long
  71.     RetV = CreateProcessWithTokenW(hToken, LOGON_WITH_PROFILE, "", StrPtr(PsName), CREATE_DEFAULT_ERROR_MODE, sEnv, "", si, PsInfo)
  72. '    RetV = CreateProcessWithTokenW(hToken, LOGON_WITH_PROFILE, StrPtr(PsName), "", dwCreationFlag, sEnv, Cdir, si, PsInfo)
  73.    
  74.     If RetV = 0 Then MsgBox "lasterror: " & Err.LastDllError

  75.     CloseHandle PsInfo.hProcess
  76.     CloseHandle PsInfo.hThread
  77.     StartPswithToken = RetV
  78. End Function
复制代码


 楼主| 发表于 2019-7-23 10:19:09 | 显示全部楼层
这是原始c++代码:
  1. #include "stdafx.h"
  2. #include "LowerSid.h"

  3. #include <Tlhelp32.h>
  4. #include <Psapi.h>
  5. #include <Userenv.h>

  6. #pragma  comment(lib,"Psapi.lib")
  7. #pragma comment(lib,"Userenv.lib")

  8. #define MAX_LOADSTRING 100


  9. DWORD GetExplorerToken(OUT PHANDLE  phExplorerToken);


  10. int APIENTRY _tWinMain(HINSTANCE hInstance,
  11.                      HINSTANCE hPrevInstance,
  12.                      LPTSTR    lpCmdLine,
  13.                      int       nCmdShow)
  14. {

  15.         TCHAR szUsername[MAX_PATH];
  16.         DWORD dwUsernameLen = MAX_PATH;
  17.         GetUserName(szUsername, &dwUsernameLen);
  18.         HANDLE hPtoken = NULL ;   
  19.         GetExplorerToken(&hPtoken) ;  
  20.         PROCESS_INFORMATION pi;   
  21.         STARTUPINFOW si = { sizeof(STARTUPINFO),NULL,L"",NULL,0,0,0,0,0,0,0,STARTF_USESHOWWINDOW,0,0,NULL,0,0,0};     
  22.         si.wShowWindow = SW_SHOW;  
  23.         si.lpDesktop = NULL;  
  24.         ZeroMemory( &pi, sizeof(pi) );   

  25.         DWORD dwError;
  26.         if(!CreateProcessWithTokenW(hPtoken, LOGON_WITH_PROFILE, NULL, L"cmd.exe", NULL, NULL, NULL, &si,&pi))
  27.         {
  28.                 dwError = GetLastError();
  29.                 if (dwError==1314)
  30.                 {
  31.                         MessageBox(NULL,_T("启动进程权限不够(需要管理员权限)"),_T("提示"),MB_OK);
  32.                 }
  33.         }
  34.         else
  35.         {
  36.                 CloseHandle( pi.hProcess );  
  37.                 CloseHandle( pi.hThread );
  38.         }


  39.         return 0;
  40. }

  41. DWORD  GetExplorerToken(OUT PHANDLE  phExplorerToken)
  42. {  
  43.         DWORD       dwStatus = ERROR_FILE_NOT_FOUND ;   
  44.         BOOL        bRet = FALSE ;  
  45.         HANDLE      hProcess = NULL ;  
  46.         HANDLE      hProcessSnap = NULL ;  
  47.         TCHAR        szExplorerExe[MAX_PATH] = { 0 } ;  
  48.         TCHAR        FileName[MAX_PATH] = { 0 } ;  
  49.         PROCESSENTRY32 pe32 = { 0 } ;  
  50.         DWORD   dwError;
  51.         __try  
  52.         {  

  53.                 _tcscat( szExplorerExe , _T("Explorer.EXE" )) ;   
  54.                 hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS , 0 ) ;   
  55.                 if( hProcessSnap == INVALID_HANDLE_VALUE )   
  56.                 {  
  57.                         dwStatus = GetLastError() ;   
  58.                         __leave ;  
  59.                 }   
  60.                 pe32.dwSize = sizeof( PROCESSENTRY32 ) ;   
  61.                 if( !Process32First( hProcessSnap, &pe32 ))      
  62.                 {     
  63.                         dwStatus = GetLastError() ;   
  64.                         __leave ;   
  65.                 }   
  66.                 do {   

  67.                         if( !_tcsncicmp( pe32.szExeFile , szExplorerExe,MAX_PATH))   
  68.                         {
  69.                                 hProcess = OpenProcess(  
  70.                                         PROCESS_QUERY_INFORMATION,  
  71.                                         FALSE ,  
  72.                                         pe32.th32ProcessID ) ;  
  73.                                 if( NULL != hProcess )         
  74.                                 {   
  75.                                         HANDLE  hToken ;  
  76.                                         if( OpenProcessToken( hProcess , TOKEN_DUPLICATE  , &hToken ))  
  77.                                         {      
  78.                                                 HANDLE hNewToken = NULL;
  79.                                                 DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hNewToken);
  80.                                                 * phExplorerToken = hNewToken ;  
  81.                                                 dwStatus = 0 ;
  82.                                                 CloseHandle(hToken);
  83.                                         }  
  84.                                         break ;  

  85.                                         CloseHandle ( hProcess ) ;   
  86.                                         hProcess = NULL ;  
  87.                                 }
  88.                                 else
  89.                                 {
  90.                                         dwError = GetLastError();
  91.                                 }
  92.                         }

  93.                         } while( Process32Next( hProcessSnap, &pe32 )) ;  
  94.                 }  
  95.         __finally   
  96.         {  
  97.                 if( NULL != hProcess )  
  98.                 {  
  99.                         CloseHandle( hProcess ) ;  
  100.                 }  
  101.                 if( NULL != hProcessSnap )  
  102.                 {  
  103.                         CloseHandle ( hProcessSnap ) ;  
  104.                 }  
  105.         }   
  106.         return dwStatus ;   
  107. }  
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2019-11-12 13:44

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表