D
devilsniffer
Unregistered / Unconfirmed
GUEST, unregistred user!
各位大大,和這個代碼類似的程式功能用BCB如何實現?<br> 服務程式中如何以當前登陸用戶身份運行程式<br><br> 開發中有時會遇到這樣的問題,當服務程式需要使用某些功能時,由於用戶的關係而受到限制,比如訪問註冊表的HKEY_CURRENT_USER鍵,使用網路等等,這時候就需要以當前登陸用戶的身份去進行操作,通常會創建一個進程來完成需要的功能。如果使用CreateProcess來創建進程的話,新創建的進程和服務程式依然是相同的用戶身份,還是無法達到目的,只有使用CreateProcessAsUser了。但CreateProcessAsUser的第一個參數是HANDLE hToken,該參數通常應該用LogonUser來獲得,但是LogonUser又需要用戶名和用戶密碼,這樣就很不現實。那應該怎麼辦呢?我想到了一個方法可以繞過LogonUser直接獲得hToken。因為用戶已經登陸,那麼肯定有Shell(就是EXPLORER.EXE)運行了,我們可以通過遍曆進程來取得Shell的hToken來運行進程。下面就是示例代碼:<br><br>BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)<br>{<br> if(!lpName)<br> {<br> return FALSE;<br> }<br> HANDLE hProcessSnap = NULL;<br> BOOL bRet = FALSE;<br> PROCESSENTRY32 pe32 = {0};<br> <br> hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);<br> if (hProcessSnap == INVALID_HANDLE_VALUE) <br> return (FALSE);<br> <br> pe32.dwSize = sizeof(PROCESSENTRY32);<br> <br> if (Process32First(hProcessSnap, &pe32)) <br> { <br> do <br> {<br> if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))<br> {<br> HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,<br> FALSE,pe32.th32ProcessID);<br> bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);<br> CloseHandle (hProcessSnap);<br> return (bRet);<br> }<br> } <br> while (Process32Next(hProcessSnap, &pe32));<br> bRet = TRUE;<br> } <br> else <br> bRet = FALSE;<br> <br> CloseHandle (hProcessSnap);<br> return (bRet);<br>}<br><br>BOOL RunProcess(LPCSTR lpImage)<br>{<br> if(!lpImage)<br> {<br> return FALSE;<br> }<br> HANDLE hToken;<br> if(!GetTokenByName(hToken,"EXPLORER.EXE"))<br> {<br> return FALSE;<br> }<br> STARTUPINFO si;<br> PROCESS_INFORMATION pi;<br> <br> ZeroMemory(&si, sizeof(STARTUPINFO));<br> si.cb= sizeof(STARTUPINFO);<br> si.lpDesktop = TEXT("winsta0//default");<br> <br> BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL,<br> FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);<br> CloseHandle(hToken);<br> if(bResult)<br> {<br> OutputDebugString("CreateProcessAsUser ok!/r/n");<br> }<br> else<br> {<br> OutputDebugString("CreateProcessAsUser false!/r/n");<br> }<br> return bResult;<br>}