在Windowsnetworking中启动远程进程

我有几台从机和一台主机一起运行分布式应用程序。 每台从机上的进程必须具有GUI和networking访问(我认为这将被称为交互式进程)。 为了便于使用,如果主机可以启动/停止这些从机上的进程,那就好了。

我的第一个想法是使用WMI和Win32_Process类来启动一个远程进程,但经过进一步的调查后发现,以这种方式启动的进程是非交互式和孤立的,因此不能有任何GUI。 有人指出,可以使用Win32_ScheduledJob.Create创build一个远程交互式进程,但是它运行在我想避免的LocalSystem帐户下(我甚至无法让它正常运行)。

什么是解决这个问题的好方法? 也许有可能启动一个帮助应用程序,然后开始一个适当的过程,但似乎很脏。

编辑:PsExec是真的笨重,当我试了一下,慢(如不知道为什么)。 进一步看看PsExec,似乎它会在远程机器上安装一个临时服务来启动应用程序。 这是唯一的方法来产生一个正确的身份互动过程? 我应该在节点的设置中包含帮助器服务吗? 但即使如此,我又如何与之沟通呢?

Solutions Collecting From Web of "在Windowsnetworking中启动远程进程"

PsExec是sysinternals套件的一部分,可以做到这一点

http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx

如果你的服务器运行的是Windows 2008,你也可以使用

终端服务远程应用

你可以使用“at”命令。

打开一个命令行并键入

at /? 

进入终端。 一个缺点是远程系统上的时间需要在你的合理的三角洲内。 这也不是即时的。 您必须等待几秒钟,以确保远程调度程序完全不会错过该事件。

有一个相当于此的WMI,并具有相同的基本注意事项,如:

列表3:在Windows server 2003,Windows XP和Win2K SP3机器上创建交互式进程的代码

 Const INTERVAL = "n" Const MINUTES = 1 strComputer = "compaq575" strCommand = "calc.exe" Set objWMIService = _ GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objScheduledJob = objWMIService.Get("Win32_ScheduledJob") Set objSWbemDateTime = _ CreateObject("WbemScripting.SWbemDateTime") objSWbemDateTime.SetVarDate(DateAdd(INTERVAL, _ MINUTES, Now())) intReturnValue = objScheduledJob.Create(strCommand, _ objSWbemDateTime.Value, False, 0, 0, True, intJobID) WScript.Echo "Job ID: " & intJobID 

我想大多数其他的方式来做到这一点(没有安装自己的服务)已经被各种服务包关闭了,因为存在漏洞。

以下两篇文章使用.NET来执行远程进程。

  1. 使用WMI

    http://weblogs.asp.net/steveschofield/archive/2006/06/06/WMI—start-a-process-on-remote-machine-passing-credentials_2E00_.aspx

  2. Codeproject示例

http://www.codeproject.com/KB/IP/RemotingExec.aspx

这些示例使用自定义凭据执行,远程可执行文件是Win Form应用程序。 希望这可以帮助。

如果enire组合理地在您的控制之下,则可以将这些远程进程实现为Windows服务。 服务可以是交互式的(不是默认的),它可以通过在每台Windows PC上运行的标准服务控制管理器进行远程控制。

请问为什么从进程需要有一个GUI? 我有一个类似的设置,但只在初始设置时需要一个GUI。

无论如何,这是我所做的,但不幸的是,它依赖于作为本地系统帐户运行的进程,我明白你试图避免,如果你真的需要的GUI。

为了给你一点背景知识,我必须分发的应用程序是Hudson ,这是一个早期的版本,你分发它的方式是运行一个Java WebStart应用程序,因此需要一个GUI(至少在设置期间帮助排除故障)。

我所做的是通过使用sc.exe(这是一个PITA得到正确的,幸运的是,你只做一次)在奴隶机器上设置从应用程序作为服务。 有些东西是:

 sc.exe create SlaveService binPath= c:\path\to\slave.exe type= interact DisplayName= "The Slave Service" 

注意参数之后的空格(binPath =等),这些是必要的。 还要注意,我发现删除“type = interact”更容易,并在服务控制台中手动更改它。

然后在主人,也使用sc.exe,我远程启动服务:

 sc.exe \\slavemachine start SlaveService 

并验证该程序正在从机上运行。

现在在我的情况下,除了初步的疑难解答之外,我并不需要GUI。 只要一切正常运行,我只需将服务配置为作为服务帐户运行,但不再处于交互模式。

我希望你觉得这有帮助。

有几个组件你需要做到这一点。

首先,您需要一种与远程机器进行通信的方法。

其次,您需要远程计算机上的一些东西,可以启动您的应用程序。

上面提到的其他建议都使用内置于这些组件中的一个或两个的东西,这很好,只要给定的解决方案的限制是适当的。

PsExec看起来像最有前途的开箱即用解决方案。 否则,你可以推出自己的应用程序,通过TCP /命名管道/不管什么,只是产生适当的子流程听简单的消息。 唯一需要注意的是你会非常小心周围的安全,特别是如果任何机器公开曝光。

PSTools套件是由Sysinternals开发的,非常棒,以至于公司在一段时间后被微软收购。 使用这些工具是完成您的任务的最佳方式。

我看到你提到交互式运行应用程序的问题。 我可以建议使用/ i开关以交互方式运行应用程序。 PSTools提供您正在寻找的所有功能。 你只需要玩开关来获得你想要的结果。

我从来没有经历过在使用PSTool的应用程序中描述的缓慢。

MPICH2经常用于高性能计算集群,应该可以做你想做的事情。 即使您不使用它来在机器之间传递消息,也可以使用它的进程启动器来启动主机上的所有进程。 它可以设置为在机器上作为特定的Windows用户进行身份验证。