2

我想让两个进程在同一个用户的登录会话中运行,通过 WCF 进行通信。NetNamedPipesBinding 似乎最适合这个。但是可能有多个用户登录并运行这些进程,所以我想要一种方法来确保每个进程只与同一用户登录会话中的其他进程对话。此外,理论上每个用户都可以多次登录同一台机器——同样,不同登录会话中的进程不应该相互交谈。

我并不特别关心安全性(与这个问题不同),这只是一个方法的问题,因此每个进程只在同一个用户会话中与另一个进程对话。

一种解决方案是将唯一的登录会话 ID 添加到端点地址,但我不确定如何获得唯一的登录会话(请参阅我的问题here)。我认为 WCF 中可能有一些方法可以解决这个问题,或者是处理这个问题的标准方法。

4

1 回答 1

1

如果您可以确定:

  1. 进程永远不会以提升的权限运行(以管理员身份运行);和
  2. 您将始终在 Vista/Win7 或更高版本上运行

那么您将默认使用 WCF 获得所需的内容。

这是因为如果托管 WCF 服务的进程没有足够的权限 (SeCreateGlobalPrivilege) 使其全局化,则 NetNamedPipeBinding 用于发布实际管道名称(基于 GUID)的共享内存机制由登录会话自动限定范围可见:仅当进程具有此权限时,命名的共享内存区域才被放入“全局”内核命名空间,否则它被放入与用户会话相关的“本地”内核命名空间。

不幸的是,WCF 没有提供任何方法来指定您甚至不希望它考虑通过“全局”命名空间发布管道。因此,如果无法保证上述条件 1 和 2,那么我能想到的唯一方法是按照您的建议,使用基于唯一登录会话 ID 的名称来命名您的端点。获取登录 SID 有点费力,需要对 Win32 API 进行非平凡的 P/Invoke,但我看到您已经在 SO 上找到了一个答案,它显示了如何做到这一点

于 2011-05-21T21:01:21.033 回答