【问题标题】:Can an out-of-process COM object determine its parent process?进程外 COM 对象能否确定其父进程?
【发布时间】:2011-02-26 22:15:26
【问题描述】:

我可以从进程外 COM 对象 (LocalServer32) 确定请求创建对象的客户端进程吗? - 具体来说,我需要掌握客户端进程命令行。

之所以出现这个问题,是因为(由于标准化、实施和支持不佳)该对象的潜在第 3 方客户端具有该对象需要解决的各种特性。

为此,对象需要能够识别其当前客户端。

不幸的是,扩展 COM 对象的接口以便客户端可以识别自己是不可能的……或者更准确地说,可以扩展接口,但我无法让客户端调用扩展。

【问题讨论】:

    标签: c++ com winapi


    【解决方案1】:

    进一步调查后,我怀疑答案是否定的,但请务必告诉我我错了。

    使用 Process Explorer 我可以看到我的 COM 对象的父进程是“svchost.exe”的一个实例,而不是客户端应用程序。

    【讨论】:

      【解决方案2】:

      由于 COM 服务器进程由相同 AppID 的所有客户端共享,因此无法实际获取客户端应用程序的 PID。正如@Anders 所说,您可以使用CoImpersonateClient(或者,更好的是,调用CoGetCallContext 并询问生成的IServerSecurity)来查找调用者的帐户 和登录会话,但你无法获得过程本身。

      如果您尝试解决旧客户端中的错误,我建议您创建一组新的 CLSID(或 IID,如果您可以使用 shim 模拟旧客户端依赖的所有错误)用于新的(非旧) 具有非常严格的输入验证的客户端,并且仅在这些新的 CLSID 中实现新功能。旧版客户端坚持使用其较旧的 CLSID,您可以在其中简单地使用现有的旧版实现(或兼容 bug 的克隆)。

      【讨论】:

        【解决方案3】:

        【讨论】:

        • 我不这么认为。这看起来让我可以假装我拥有客户端的安全属性。
        • 您是否尝试调用 OpenThreadToken+GetTokenInformation(在 CoImpersonateClient 之后)您至少应该能够找到登录会话 luid 和用户登录 sid。
        • 很抱歉,但鉴于这些信息,我将如何访问 COM 对象的客户端进程?
        猜你喜欢
        • 2018-04-23
        • 1970-01-01
        • 2017-05-01
        • 2019-11-06
        • 1970-01-01
        • 2014-02-05
        • 2010-09-05
        • 2012-08-02
        • 1970-01-01
        相关资源
        最近更新 更多