各位大大,和這個代碼類似的程式功能用BCB如何實現? |
|
w45
一般會員 發表:25 回覆:29 積分:15 註冊:2006-07-13 發送簡訊給我 |
各位大大,和這個代碼類似的程式功能用BCB如何實現?
服務程式中如何以當前登陸用戶身份運行程式 開發中有時會遇到這樣的問題,當服務程式需要使用某些功能時,由於用戶的關係而受到限制,比如訪問註冊表的HKEY_CURRENT_USER鍵,使用網路等等,這時候就需要以當前登陸用戶的身份去進行操作,通常會創建一個進程來完成需要的功能。如果使用CreateProcess來創建進程的話,新創建的進程和服務程式依然是相同的用戶身份,還是無法達到目的,只有使用CreateProcessAsUser了。但CreateProcessAsUser的第一個參數是HANDLE hToken,該參數通常應該用LogonUser來獲得,但是LogonUser又需要用戶名和用戶密碼,這樣就很不現實。那應該怎麼辦呢?我想到了一個方法可以繞過LogonUser直接獲得hToken。因為用戶已經登陸,那麼肯定有Shell(就是EXPLORER.EXE)運行了,我們可以通過遍曆進程來取得Shell的hToken來運行進程。下面就是示例代碼: BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName) { if(!lpName) { return FALSE; } HANDLE hProcessSnap = NULL; BOOL bRet = FALSE; PROCESSENTRY32 pe32 = {0}; hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) return (FALSE); pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hProcessSnap, &pe32)) { do { if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName))) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,pe32.th32ProcessID); bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken); CloseHandle (hProcessSnap); return (bRet); } } while (Process32Next(hProcessSnap, &pe32)); bRet = TRUE; } else bRet = FALSE; CloseHandle (hProcessSnap); return (bRet); } BOOL RunProcess(LPCSTR lpImage) { if(!lpImage) { return FALSE; } HANDLE hToken; if(!GetTokenByName(hToken,"EXPLORER.EXE")) { return FALSE; } STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb= sizeof(STARTUPINFO); si.lpDesktop = TEXT("winsta0\\default"); BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL, FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); CloseHandle(hToken); if(bResult) { OutputDebugString("CreateProcessAsUser ok!\r\n"); } else { OutputDebugString("CreateProcessAsUser false!\r\n"); } return bResult; } 這樣就可以以登陸用戶的身份來運行程式了,呵呵。 如果哪位朋友有更好的方法,歡迎提出一起討論。 |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
您在下面網址請小弟來此回答
http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=86340 您應該要去操作 HKEY_USERS 才對, 不是 HKEY_CURRENT_USER HKEY_CURRENT_USER 是指向目前登入使用者的資訊, 您用Adminstrator登入, 當然是有關Adminstrator的資訊 用 Adminstrator登入, HKEY_CURRENT_USER 又會指向 HKEY_USERS 中代表 Adminstrator的機碼 用 Power Users 登入, HKEY_CURRENT_USER 又會指向 HKEY_USERS 中代表 Power Users 的機碼 因為使用群組和帳號, 實際上運作時候是一個代碼 HKEY_USERS 中哪一個是表示 Power Users, 只能實際去看機碼內容 (例如先用 Power Users 登入去安裝一套軟體)
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |