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

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

有什么好的方法可以解决这个问题呢?也许可以启动一个帮助应用程序,然后启动一个正确的进程,但这看起来很脏。

编辑:当我尝试时,PsExec 真的很笨重,而且速度慢得要命(不知道为什么)。进一步查看 PsExec ,它似乎在远程计算机上安装了一个临时服务来启动应用程序。这是使用正确身份生成交互式进程的唯一方法吗?我应该在节点设置中包含辅助服务吗?但即便如此,我该如何与它沟通呢?

有帮助吗?

解决方案

PSEXEC是Sysinternals的套件的一部分,可以做到这

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

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

终端服务远程应用

其他提示

可以使用 “在” 命令。

打开命令行并键入

at /?

入终端。一个缺点是,在远程系统上的时间需要是你的一些合理的delta中。它也不会瞬间。你要等待几秒钟,以确保远程调度并不完全错过的事件。

有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. 代码项目示例

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

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

如果该enire组是合理的控制下,有可能实现这些远程进程作为Windows服务。服务可以是交互式的(默认情况下虽然),它可以通过标准的服务控制管理器的每个Windows PC上运行的远程控制。

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

总之,这里就是我所做的,但不幸的是它依赖于运行以LocalSystem账户,我明白你试图避免的,如果你真的需要的GUI过程。

为了让你的背景一点点,应用我不得不发布了哈德森,这是一个早期版本,您分发是运行Java Webstart的应用程序的方式,因此需要一个GUI(设置至少在起来,以帮助排除故障)。

我所做的是通过使用SC.EXE建立从应用程序作为从机服务(这是一个PITA得到正确的,幸运的是,你只能这样做一次)。沿着线的东西:

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

请注意的参数后的空间(binPath =等等),这些都是必要的。还要注意的是,我发现更容易掉落“类型=相互作用”和手动改变它在服务控制台。

然后在主,还使用SC.EXE,我远程启动服务:

sc.exe \\slavemachine start SlaveService

和验证了程序上的从机器上运行。

现在在我的情况,我并不真正需要的GUI,比最初的故障排除等。当我得到的一切运行正常,我简单地配置为一个服务帐户在交互模式下运行,但不再是服务。

我希望对您有所帮助。

有一对夫妇,你会需要做到这一点的组件。

首先,则需要与远程机器通信的方法。

其次,你需要在远程机器上听的东西,可以启动应用程序。

上面的所有其他的建议使用一些内置的一个或这两种组分,这是很好,所以只要任何给定方案的限制是合适的。

PSEXEC看起来最有前途的,外的现成的溶液。否则,你可以推出自己的应用程序来听,通过TCP /命名管道/不管,只是产卵适当的子流程,简单的信息。与唯一需要注意的是,你会希望身边的安全性非常小心,尤其是如果任何一台机器被公开曝光。

在PsTools套件是由Sysinternals公司开发,是如此之大,该公司被微软一段时间后购买。使用这些工具是完成任务的最好方式。

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

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

MPICH2 是在高性能计算集群经常使用并且应当能够做你想做什么。即使你不使用它传递机器之间的信息,您可以使用它的进程启动从主计算机启动的所有进程的了。它可以被设置为机器上的特定的Windows用户进行身份验证。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top