【问题标题】:How can I remotely execute a program on multiple clients from a web app?如何从 Web 应用程序在多个客户端上远程执行程序?
【发布时间】:2011-05-28 23:10:30
【问题描述】:

所以我对我正在从事的项目有以下要求,但我无法找出最好的(或任何,就此而言)方法。

我在总部的 IIS 上有一个 asp.net Web 应用程序。当某个特定事件发生时,我需要在整个公司动态选择的 PC 子集上显示一条消息。由于此过程的时间限制(4 小时的反应时间),必须显示该消息,我们在法律上不能不显示该消息。

所以我需要做以下事情:

  • 向用户显示消息。我有一个 winforms 应用程序,它会弹出一个对话框,摆脱它的唯一方法是单击一个大的“确认”按钮。
  • 确保显示消息。某种形式的反馈是,是的,它已显示并随后得到确认。
  • 表单未显示时的反应方式。

我考虑过以下几点:

  • PsExec - 在我的网络应用程序中异步迭代每个节点以触发远程 可在每台 PC 上执行。
  • .NET Remoting - 我对此一点也不熟悉,它让我转而关注 WCF。它对我想做的事情有用吗?
  • WCF 回调 - 这些似乎需要持续连接,我不确定这对我们的基础设施意味着什么。我想象有一个客户端服务会启动应用程序或以某种方式显示表单。
  • 我们的调度软件(Tidal Enterprise Scheduler) - 远程执行可执行文件。这会引入更多的故障点。

在 SO 看来,解决这个问题的最佳方法是什么?提前感谢您的帮助。

【问题讨论】:

  • 您说“当特定事件发生时”- 是用户发起的事件还是系统/计时器事件?后者将很难使用基于网络的系统可靠地完成。

标签: c# .net asp.net client-server distributed


【解决方案1】:

一种方法是:

  1. 在每个桌面上安装一个客户端应用程序
  2. 让该应用程序(在定时事件中)调用 Web 服务以获取它需要显示的任何消息,或直接联系数据库服务器以获取它需要显示的消息。
  3. 显示消息后,让应用程序告诉 Web 服务或 sql 服务器它已被看到。记录日期时间和登录用户。

您的网络应用程序应该简单地将消息存储在数据库中;并且,如果您想要一点稳健性,请公开桌面应用程序调用以检索消息并将其标记为已查看的 Web 服务。这将避免需要让桌面应用程序直接与 sql server 对话,并且意味着桌面应用程序可以安装在世界任何地方。

桌面应用程序的安装方式应使其不能被禁用/关闭/卸载。有无数种方法可以做到这一点。

我不会使用您定义的任何方法,因为它们很复杂并且会引入太多的脆弱性。

更新 锁定应用程序的几种方法就在我的脑海中:

  1. 拥有以管理员身份运行的监视程序服务,用于监视桌面应用程序。如果它被杀死然后强制它重新启动。您可以通过 WMI 进行监控。一些 AV 软件可以做到这一点。请务必剥夺用户停止服务的权利。
  2. 删除用户使用或访问任务管理器的能力。很多病毒变种都是这样做的,从group policy settings 很容易做到。
  3. 如果它们位于域中,请确保您的组策略设置强制安装您的桌面应用程序并强制它在 Windows 启动时自动运行。

如果您真的希望它有效,请执行以下操作: 确保您的应用程序每小时通知一次主服务器它正在运行。让 CEO 发送一条消息,说明如果应用程序被关闭,相关员工将被解雇。他们可能会比这更好一点。定期运行审计报告并解雇几个人以吓唬其他人。我保证在那之后没有人会搞砸它。

确保审核报告得到经理的确认...毕竟员工可能不在那天。 ;)

【讨论】:

  • 在这里与同事的讨论也遵循同样的思路。您能否详细说明锁定应用程序的无数种方法?我在考虑 windows 服务,但你的意思告诉我有更好的方法..?
  • @IronicMuffin:查看更新。我合作过的一家公司做了最后一个选择。第一周,有几个人想出了如何禁用它,有几个人被公开退出。后来没有人上当。如果它在法律上像您建议的那样重要,那么您应该能够在该选项上获得 exec 级别的签名。
  • @IronicMuffin:顺便说一句,我认为 Vista 及更高版本会阻止服务拥有 UI 组件;因此需要一个常规的桌面应用程序。
【解决方案2】:

您可以让总部应用程序在一个表中设置一些记录,该表知道哪些客户端需要显示消息

Message [ComputerName, IsAcknowledged]

然后每个客户端将在必要时查看该表,以查看其 ComputerName 是否存在并且 IsAcknowleded == false。如果是,则显示提示以确认,更新他们的记录

【讨论】:

  • 我相信这是我将采取的路线,但上面克里斯的回答更详细,适用于整个系统。谢谢!
【解决方案3】:

探索发布和订阅设计模式。这可能是您的正确解决方案。基本上它启动一个服务,您的所有 Windows 应用程序都将向该服务注册回调,并且从您的 Web 应用程序中,您可以在服务中引发一个事件,该事件将发布所有已注册的应用程序。 Publisher 将具有根据事件和来源识别您 PC 子集的逻辑。

【讨论】:

  • 我喜欢它的发展方向,但缺点是缺乏保证交付和假设订户可用的困难。我认为这不能满足我当前的需求。
  • 设计模式是通用解决方案,您始终可以通过 .NET 中的许多强大选项来克服这些缺点。只要触发事件的 Web 应用程序可用,您的 Web 服务器上的 Windows 服务是一个可行的选择,可以让服务始终启动并运行...
猜你喜欢
  • 2011-12-10
  • 2011-04-20
  • 1970-01-01
  • 2018-05-31
  • 2012-02-12
  • 2019-12-08
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多