VBGood網站全文搜索 Google

搜索VBGood全站網頁(全文搜索)

VB愛好者樂園(VBGood)

 找回密碼
 立即注冊
搜索
查看: 929|回復: 1
打印 上一主題 下一主題

[求助] vb6 管理員權限 啟動 普通權限進程

[復制鏈接]
跳轉到指定樓層
1
發表于 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
復制代碼


2
 樓主| 發表于 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-12-7 22:25

VB愛好者樂園(VBGood)
快速回復 返回頂部 返回列表
快乐十分开奖结查询