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

Can you identify which processes are using an ncalrpc RPC Endpoint externally?

当我们的开发人员在将新构建的 运行 服务器进程附加到 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);,我真的不能说。

现在我们要么必须手动追踪连接到该服务的所有进程和 kill/stop 它们,要么采取 "easy" 方式退出并在安装新服务后执行重启,允许我们在将进程附加到 VS2017 时在正确的文件位置进行调试。

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

或者 this article 似乎表明首先可以通过称为关联的方式避免此问题,但对于如何做到这一点有些模糊。

The association itself is reference-counted, and when all references are gone, it stops and closes all connections. Every binding handle and every context handle hold a reference on the association. When all are closed, the association disappears.

更新:

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

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 才能列出它们。