7

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

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

解决这个问题的好方法是什么?也许可以启动一个辅助应用程序,然后启动一个正确的进程,但这似乎很脏。

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

4

8 回答 8

6

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

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

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

终端服务远程应用程序

于 2009-04-02T21:04:01.480 回答
1

您可以使用“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

我认为大多数其他方法(无需安装您自己的服务)已因漏洞而被各种服务包关闭。

于 2009-06-26T15:36:40.617 回答
1

以下两篇文章使用 .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 应用程序。希望这可以帮助。

于 2009-06-27T08:50:36.047 回答
1

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

于 2009-06-29T11:54:36.280 回答
1

请问为什么slave进程需要有GUI?我有类似的设置,但仅在初始设置期间需要 GUI。

无论如何,这就是我所做的,但不幸的是,它依赖于作为 LocalSystem 帐户运行的进程,我知道如果你真的需要 GUI,你会试图避免这种情况。

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

我所做的是使用 sc.exe 将从属应用程序设置为从属机器上的服务(这是一个正确的 PITA,幸运的是你只这样做了一次)。类似于以下内容:

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

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

然后在master上,同样使用sc.exe,我远程启动服务:

sc.exe \\slavemachine start SlaveService

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

现在就我而言,除了初始故障排除之外,我并不真正需要 GUI。一切正常运行后,我只需将服务配置为作为服务帐户运行,但不再处于交互模式。

我希望你觉得这有帮助。

于 2009-07-01T01:24:37.133 回答
1

要实现这一点,您需要几个组件。

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

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

其他建议首先使用这些组件中的一个或两个内置的东西,这很好,只要任何给定解决方案的限制是适当的。

PsExec 看起来是最有前途的开箱即用解决方案。否则,您可以滚动自己的应用程序以通过 TCP/命名管道/其他方式收听简单消息,然后生成适当的子进程。唯一需要注意的是,您需要非常小心安全性,尤其是在任何机器公开暴露的情况下。

于 2009-07-01T01:59:27.843 回答
0

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

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

在我使用 PSTools 的应用程序中,我从未经历过您所描述的缓慢。

于 2009-06-30T13:09:53.570 回答
0

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

于 2012-04-11T15:23:23.310 回答