我正在编写一个程序,用作从服务器到客户端机器的 RemoteApp。
我知道使用System.Windows.Forms.SystemInformation.TerminalServerSession
我可以确定当前会话是本地会话还是来自 RemoteApp 执行的远程会话。
如果终端服务器会话为真(当用户远程运行应用程序时),是否有办法告诉本地计算机执行应用程序(如 MS Word)?如果有帮助的话,我想在本地执行此操作,而不使用插件或 psexec。
答案1
取决于用户与服务器的距离,但我们假设他们都在网络或 VPN 末端的办公室中。
我将创建一个 dotNet 应用程序,连接到中央 SQL Server,并每 250 毫秒扫描一次包含您的 PC 名称的简单记录。记录中的第二个字段是要运行的程序。
这意味着基于服务器的应用程序每次想要在本地打开程序时都可以写入数据库。在 250 毫秒内,本地应用程序将找到该记录、启动该应用程序并删除该记录。
答案2
您有 4 个选项,它们的复杂性、可靠性和部署考虑程度各不相同。
1)PSEXEC。说真的,很多人使用 psexec 来达到这个目的,而且大多数时候都有效。这是迄今为止最简单的解决方案。使用 -i 以便它可以与桌面交互。
2) WMI。您可以编写 .net 或 VBScript 代码来执行客户端应用程序。它与 psexec 一样具有脚本性,但完全是原生的。我以前遇到过 WMI 的可靠性问题,但那些是域范围的自动化操作,而且大部分问题似乎都是空闲工作站的电源管理问题。 http://www.codeproject.com/Articles/31113/Create-a-Remote-Process-using-WMI-in-C
3)Windows任务调度程序。从服务器调度一个任务在用户会话中在客户端上执行。仍然带有脚本,有很多活动部件。 http://technet.microsoft.com/en-us/library/cc772785%28v=ws.10%29.aspx
4)为本地电脑创建一个windows网络服务,并在收到信号后在用户会话下启动该任务。您可能必须使用任务计划程序来完成此操作。需要开发和测试大量工作,难以部署,有很多活动部件,而且在某些地方仍有脚本,但这可能是微软的答案,因为它正确地实现了他们对流程提升的指导。