2009-09-01 102 views
1

我編寫一個C++ windows應用程序(A),它使用LogonUser,LoadUserProfile和ImpersonateLoggedOnUser獲取另一個用戶(Y)的權限。 含義A開始使用在工作站(X)上登錄的用戶。如果用戶想提升他的權利,他只需按下一個按鈕並以另一個用戶身份登錄,而不必自行註銷窗口並返回。ImpersonateLoggedOnUser並啓動一個使用ocx的新進程失敗

現在的情況是(根據函數的返回值): LogonUser的工作原理,LoadUserProfile的作品和ImpersonateLoggedOnUser的作品。

模仿之後,我開始另一個過程。這個過程是一個需要OCX控制的應用程序(B)。 這會失敗,應用程序告訴我.oxc文件沒有正確安裝。

問題是,如果我直接以登錄到機器(X)的用戶身份啓動B,它就會起作用。 如果我以用戶(Y)的身份直接開始B,而我想使用A提升我的權限,則它可以工作。

如果我以(X)身份登錄並在資源管理器中選擇「運行方式」(Y),它就可以工作!

你知道我需要做哪些步驟來執行與Windows上的「運行方式」對話框相同的操作嗎?

+0

可能是環境瓦爾特別是如果COM註冊使用%COMMONPROGRAMFILES%\ SomeDirHere \ MyLib.OCX爲InProc服務器位置。轉儲產生的進程的環境。 – wqw 2009-09-01 19:39:43

回答

0

謝謝大家您的幫助。 以下是能夠解決我的問題:
我開始使用CreateProcessWithLogonW()所需的過程。 爲了讓這個功能正常工作,我必須RevertToSelf()之前我叫它,然後再做模擬。

所以序列是現在:

LogonUser() 
LoadUserProfile() 
ImpersonateLoggedOnUser() 
// work with the app 
RevertToSelf() 
CreateProcessWithLogonW() 
// do the impersonation stuff again 
1

我不知道,不過貌似模仿是不夠的 - 模擬只涉及過程(A),而是試圖用的CreateProcess ProcessAttributes/ThreadAttributes明確從Windows的ACL設置爲模擬的用戶

+0

感謝您的提示,假冒只涉及(A) 現在我嘗試使用MSDN告訴我CreateProcessWithLogonW()是CreateProcessAsUser()的首選。 現在的順序是: LogonAsUser() LoadUserProfile() ImpersonateLoggedOnUser() CreateProcessWithLogonW() 其中CreateProcessWithLogonW()失敗,錯誤代碼5(拒絕訪問) 任何想法從哪裏走? – markus 2009-09-01 09:29:33

+0

嘗試sysinternal utils(FileMon或RegMon)在拒絕「拒絕訪問」之前明確地查看究竟是什麼問題。另外,每個msdn:「默認情況下,CreateProcessWithLogonW不會將指定的用戶配置文件加載到HKEY_USERS註冊表項中。這意味着對HKEY_CURRENT_USER註冊表項中信息的訪問可能不會產生與正常交互式登錄一致的結果」。請注意OCX密集使用註冊表。 – Dewfy 2009-09-01 11:18:09

+0

@Dewfy:謝謝你的提示。特別是你提到的工具在將來也會對我有用! 訪問被拒絕是通過在調用CreateProcessWithLogonW()之前調用RevertToSelf()來解決的, – markus 2009-09-02 10:52:30