你能确定哪些进程在外部使用 ncalrpc RPC 端点吗?

Posted

技术标签:

【中文标题】你能确定哪些进程在外部使用 ncalrpc RPC 端点吗?【英文标题】:Can you identify which processes are using an ncalrpc RPC Endpoint externally? 【发布时间】:2019-02-27 01:13:55 【问题描述】:

当我们的开发人员在将新建和运行的服务器进程附加到 VS2017 调试器后尝试调试 C++/Winrt ncalrpc RPC 服务器时,即使启用断点代码,他们也无法对新的或修改的代码行进行断点不完全相同;它会在 IDE 中产生意外的符号错误消息。

一位团队成员告诉我,这是因为使用核心服务的其他应用程序和服务与 RPC 端点的 RPC 连接持续存在。我对 RPC 了解不多,但一直在阅读。检查核心服务的来源似乎表明他们为stopping the server 所做的一切都是正确的,

RPC_STATUS rs = 0;
rs = RpcMgmtStopServerListening(NULL);
//...
rs = RpcServerUnregisterIf(RPC_IF_SPEC, nullptr, 0);
//...
rs = RpcEpUnregister(RPC_IF_SPEC, BindingVector, nullptr);

但说实话,他们也可能应该使用rs = RpcServerUnregisterIf(NULL, NULL, 0);,我真的不能说。

现在,我们要么必须手动跟踪连接到该服务的所有进程并杀死/停止它们,要么采取“简单”的方式并在安装新服务后重新启动,以便我们在正确的情况下进行调试将进程附加到 VS2017 时的文件位置。

解决此问题的实用方法是查看是否可以生成连接到 RPC 端点的进程列表、核对它们、安装新服务,然后重新启动它们。

另外,this article 似乎表明可以通过称为关联的东西首先避免这个问题,但对于如何做到这一点有些模糊。

关联本身是引用计数的,当所有引用都消失时,它会停止并关闭所有连接。每个绑定句柄和每个上下文句柄都持有一个对关联的引用。全部关闭后,关联消失。

更新:

接受的答案表明这对于外部进程是不可能的; 使用外部流程不是实现这一目标的方法。

【问题讨论】:

您是否在寻找 RpcServerInqCallAttributes docs.microsoft.com/en-us/windows/desktop/api/rpcasync/… 它允许您从客户端获取大量信息,包括其进程 id(专为 ncalrpc 量身定制的 RPC_QUERY_CLIENT_PID) 除非我理解不正确,否则它会声明,“...获取客户端安全上下文属性的 RPC 服务器调用。” 这似乎表明它是一个可用的 API在通过连接的客户端时由 RPC 服务器,而不是外部进程使用 ad-hoc 的东西。我们实际上在 RPC 服务器实现本身的部分源代码中使用此 API 来处理 RPC_CALL_ATTRIBUTES_V2ClientID 当然,这个API只能在服务器上运行。我认为没有其他方法,您可以轻松地构建最后一次看到的客户端进程列表(带有时间戳)并以某种方式公开它(例如使用服务器可能具有的另一个 RPC 接口)。 如果你能找到不可能的支持文件,我会接受它作为答案并奖励赏金。 赏金将在 【参考方案1】:

RPC 有一个RpcServerInqCallAttributes function,RPC 服务器可以在客户端调用期间使用它来获取客户端的安全上下文属性和其他信息。

您必须传递一个RPC_CALL_ATTRIBUTES_V2,仅适用于 Windows Vista 和更高版本的 Windows(或 RPC_CALL_ATTRIBUTES_V3,适用于 Windows 8 和更高版本),因此如下所示:

// the code depends on the minimal platform you compile for
RPC_CALL_ATTRIBUTES atts =  0 ; // should map to RPC_CALL_ATTRIBUTES_V2 or RPC_CALL_ATTRIBUTES_V3

atts.Version = RPC_CALL_ATTRIBUTES_VERSION; // should be 2 or 3
atts.Flags = RPC_QUERY_CLIENT_PID;
RpcServerInqCallAttributes(0, &atts);
... pid is in atts.ClientPID ...

这只能从 RPC 服务器本身调用,因此您必须以某种方式记录所有客户端 pid 并向服务器添加一些 API 才能列出它们。

【讨论】:

以上是关于你能确定哪些进程在外部使用 ncalrpc RPC 端点吗?的主要内容,如果未能解决你的问题,请参考以下文章

带有 ncalrpc 的 RPC 端点列表

如何使用安全 RPC?

使用 windows api 解释 RPC 身份验证

使用 RpcServerInqCallAttributes 检索 clientPID

创建在外部进程中运行的 WPF“控件”

vscodec语言怎么不能在外部运行直接退出