2010-06-02 68 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)。