全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2374
推到 Plurk!
推到 Facebook!

各位大大,和這個代碼類似的程式功能用BCB如何實現?

 
w45
一般會員


發表:25
回覆:29
積分:15
註冊:2006-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-12-29 09:19:31 IP:222.135.xxx.xxx 訂閱
各位大大,和這個代碼類似的程式功能用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-01-24 08:51:20 IP:61.219.xxx.xxx 未訂閱
您在下面網址請小弟來此回答
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 登入去安裝一套軟體)


------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
系統時間:2017-10-21 7:34:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!