2010-06-02 72 views
5

從過程外的一個COM對象(LocalServer32)我可以確定所請求的對象的創建客戶端進程? - 具體而言,我需要掌握客戶端進程命令行。進程外COM對象能否確定其父進程?

這個問題棱因爲(由於標準化很差,實施和支持)對象的潛在第三方客戶有多種,其對象必須要解決idiosyncracies的。

要做到這一點的對象需要能夠識別當前的客戶端。

擴展COM對象的接口,以便客戶端可以識別自己是不可能的......或者更確切地說,接口可以擴展,但我不能讓客戶端調用擴展。

回答

2

說完看着這進一步懷疑我的回答將是「否」,而是通過各種手段告訴我,我錯了。

使用Process Explorer中,我可以看到我的COM對象的父進程是「svchost.exe的」一個實例,而不是客戶端應用程序。

0
+0

我不這麼認爲。這看起來像允許我假裝我有客戶端的安全屬性。 – 2010-06-03 15:42:29

+0

您是否嘗試調用OpenThreadToken + GetTokenInformation(在CoImpersonateClient之後)您至少應該能夠找到登錄會話luid和用戶登錄sid。 – Anders 2010-06-03 20:38:16

+0

我很抱歉,但給了那些信息我將如何到達COM對象的客戶端進程? – 2010-06-04 08:49:50

1

由於COM服務器進程由相同的AppID的所有客戶端共享的,它不可能真正得到客戶端應用程序的PID。正如@Anders所說,您可以使用CoImpersonateClient(或者更好的方式,請致電CoGetCallContext並詢問產生的IServerSecurity)以找到帳戶和調用者的登錄會話,但無法獲取該進程本身。

如果您嘗試解決傳統客戶端中的錯誤問題,我建議您創建一組新的CLSID(或者IID,如果您可以模擬傳統客戶端依賴於墊片的所有錯誤)傳統)客戶端進行嚴格的輸入驗證,並僅在這些新的CLSID中實現新功能。傳統客戶端堅持使用舊的CLSID,您可以在其中簡單地使用現有的舊版實現(或兼容bug的bug)。