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



我在一个COM+/Enterprise Services服务组件中有一些。net代码。我从WPF应用程序和遗留的VBA应用程序与此组件通信。

当只有一个用户登录到一台机器时,这种安排工作得很好。当。net或遗留应用程序实例化其COM对象之一时,组件在其自己的进程中启动。

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

激活选项卡上的组件服务中,我的应用程序被配置为作为"服务器应用程序"运行。在Identity选项卡上,选择"交互式用户"。在Security选项卡上,"对此应用程序强制访问检查"未选中。

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

我使用WCF创建了一个带有net命名管道侦听器https://learn.microsoft.com/en-us/dotnet/framework/wcf/index的服务

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

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

在AIUI中,您不能调用一个rpc方法,它最终会在原始端调用rpc,尽管这可能是命名管道的限制。

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

很难找到任何权威的东西。对于标准COM,你可以将身份设置为"启动用户"。对于COM+,则不可用。

根据这篇存档的文章,

COM+应用程序可以配置为在登录帐户下运行,或者指定的帐户。在应用程序属性下,参见Identity选项卡。

…然而,一旦设置,它将一直在该帐户下,直到应用程序关闭,因此您不能让多个用户使用相同的COM+应用程序不同的id。

这似乎也符合这篇知识库文章中所说的。

我的结论是,我应该接受组件必须每台机器运行一次,而不是每个会话运行一次。它将需要修改以适应这一点。由于它需要在单个会话中启动新进程,因此它必须在本地系统帐户下作为Windows服务运行(适当注意安全含义)。

最新更新