服务组件是在终端服务器上的用户会话之间共享的,还是为每个用户会话启动了一个进程?

时间:2014-07-16 18:08:41

标签: windows .net-4.5 com+ terminal-services

我在COM + / Enterprise Services服务组件中有一些.NET代码。我从WPF应用程序以及旧版VBA应用程序与此组件进行通信。

当只有一个用户登录到计算机时,此安排很有效。当.NET或遗留应用程序实例化其中一个COM对象时,该组件将在其自己的进程中启动。

系统也适用于第一个用户,以尝试在终端服务器安装上运行它。但是,当其他用户登录时,他/她无法使用该应用程序。我曾希望每个会话都是孤立运行的,并且每个会话都会运行一个主机进程。这个期望我错了吗?

激活标签上的组件服务中,我的应用程序配置为作为"服务器应用程序"运行。在身份标签上,"互动用户"被选中。在安全标签上,"强制执行此应用程序的访问权限检查"未经检查。

2 个答案:

答案 0 :(得分:0)

很难找到任何权威的。对于标准COM,您可以set the identity to 'Launching user'。 COM +没有相同的功能。

根据this archived post

  

可以将COM +应用程序配置为在登录帐户下运行,或   指定的帐户。在应用程序属性下,请参阅“标识”选项卡   ...
  但是,一旦设置,它将保留在该帐户下,直到应用程序关闭   因此,您无法让多个用户使用相同的COM +应用程序   不同的ID。

这似乎与this knowledge base article中的内容相符。

我的结论是,我应该接受我的组件必须每台机器运行一次而不是每个会话一次。需要对其进行修改以适应这种情况。由于它需要在单个会话中启动新流程,因此必须在本地系统帐户下运行 Windows服务(适当注意安全隐患)。 / p>

呃。

答案 1 :(得分:0)

您所描述的没有会话隔离,而是处理所有权限制您有权访问的内容。 你的结论似乎是正确的。您需要确定一种与服务交换数据的合适机制。

我使用WCF创建一个具有网络命名管道侦听器https://docs.microsoft.com/en-us/dotnet/framework/wcf/index

的服务

使用代理进行rpc调用的想法很有吸引力,但我发现代理定义和存根将它们连接在一起非常笨拙而无法使用。

如果您有可能在任何一端触发的事件,那么保持客户端/服务同步就会出现问题。

AIUI你不能调用最终在原始端调用rpc的rpc方法,尽管这可能是命名管道限制。

如果我再次这样做,我会在服务中使用套接字服务器&用于双向数据传输的websocket协议,即使您可能需要实现一些线程处理以避免在为请求提供服务时阻塞侦听器线程。