是否可以启动远程应用程序并在Windows中以交互方式显示?

时间:2011-07-29 12:10:05

标签: c# windows interactive remote-access

我确信此前已被问过,但我还没有找到问题或答案。

我有一个自定义选项卡式应用程序,可在每个选项卡上显示各种科学仪器的数据。当我的应用程序中单击选项卡时,我的用户想要单击选项卡并让我的应用程序启动另一台机器上的各种仪器控制器应用程序(或将它带到前台)。

我尝试了很多不同的方法,从编写我自己的C#应用​​程序到Process.Start,编写第二个C#应用程序,它存在于远程计算机上并使用Sysinternals的psexec等启动相应的应用程序。我可以在远程计算机上成功启动进程,但无论用户使用哪个用户凭据(无论用户是否以交互方式登录),GUI都会丢失。我相信这是Windows中的安全增强功能。

查看Create() method of the Win32_Process MSDN documentation揭示了我怀疑的内容 - 出于安全原因,Win32_Process.Create方法无法用于远程启动交互式进程。

在一段时间间隔后,我能做的最好的事情是remotely access Task Scheduler to kick off the remote application。我确定这会给我的应用带来可怕的用户体验(谁想要点击一个标签并等待30秒?)所以我避免这种做法。

有人可以建议一种可行的方法,或者有助于反驳这样做的可能性吗?

编辑 psexec自己的documentation证实了我的论点,即不可能。 -x标志显示“在Winlogon桌面上显示UI(仅限本地系统)”。如果可能的话,我确信Sysinternals会让它成功。

1 个答案:

答案 0 :(得分:2)

在侦听命令的远程计算机上进行正常的交互式处理。然后,您可以向其发送命令以运行相应的过程。你可以这样做:

  1. 将您的流程放在“开始”菜单(或注册表的HKLM / HKCU运行部分)中的用户启动组中。
  2. 每当用户登录时,您的流程将以交互方式运行。您可以创建一个托盘图标以指示它正在运行。
  3. 您的进程会打开一个TCP端口来侦听命令。
  4. 另一台计算机上的控制进程向TCP端口发送命令。
  5. 您的进程运行指定的命令。由于您的流程以交互方式运行,因此子流程也将是交互式的。
  6. TCP端口将是一个巨大的安全漏洞。根据需要尽可能多地保护它。