2013-02-13 54 views
3

我正在嘗試爲進程外COM服務器(在另一臺機器上)編寫一個C++包裝器。我希望能夠隱藏所有與這個類的用戶有關的COM相關的瑣事。是否可以將代理安全毯從一個對象複製到另一個對象?

安全性要求迫使我在服務器代理上調用CoSetSecurityBlanket。那就是:

CoCreateInstance(CLSID_OutOfProcServer, &proxy); 
CoSetProxyBlanket(proxy); 

(我遺漏了很多參數)。另外,由於服務器需要本地帳戶,因此我必須在此呼叫中指定憑證。

現在是這個問題。這個服務器有很多返回接口的方法,並且這些接口中的每一個都是我的一個全新的代理。因此,每次我得到一個時,我必須撥打CoSetProxyBlanket()。這是我想要完成的任務:

  1. 有我的包裝隱藏CoSetProxyBlanket調用(很容易做到)
  2. 避免在內存中存儲的憑據

到目前爲止,我已經(極難!)嘗試使用CoQueryProxyBlanketCoSetProxyBlanket將毯子從一個物體複製到另一個物體。這不起作用,因爲我無法恢復憑據(除非我將它們存儲在我想避免的內存—中)。

真正令人沮喪的是我有一個到服務器的認證連接。看起來我應該能夠將其安全上下文複製到新代理中。 (或者至少告訴COM在創建新代理時爲我做這件事。)有沒有辦法做到這一點,或者我堅持存儲憑據?

回答

0

試試這個:

  1. 通過調用LogonUser的(獲取模擬令牌),並與令牌
  2. 設置代理毯,而不是儲存此憑證的憑證
  3. ImpersonateLoggedOnUser()與AUTHINFO設置爲NULL
  4. RevertToSelf()

我沒有試過這個,只是暗示一個想法...

+0

感謝您的建議,但它不能幫助。請記住,這是遠程計算機上的本地帳戶,因此我無法使用LogonUser獲取模擬令牌。 – 2013-05-15 20:25:28