在Windows网络中启动远程进程

在Windows网络中启动远程进程,windows,networking,distributed,cluster-computing,remote-process,Windows,Networking,Distributed,Cluster Computing,Remote Process,我有几个从机和一个主机,它们一起运行一个分布式应用程序。每个从机上的进程都必须有一个GUI和网络访问(我认为这将被称为交互式进程)。为了便于使用,如果主机可以启动/停止这些从机上的进程,那就太好了 我的第一个想法是使用WMI和Win32_Process类来启动远程进程,但经过进一步调查发现,以这种方式启动的进程是非交互式和隔离的,因此不能有任何GUI。注意:可以使用Win32_ScheduledJob.Create创建远程交互进程,但它在LocalSystem帐户下运行,这是我想要避免的(我甚至

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

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

解决这个问题的好方法是什么? 也许可以启动一个助手应用程序,然后启动一个适当的流程,但这看起来相当脏


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

PsExec是sysinternals套件的一部分,可以实现这一点

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

您可以使用“at”命令

打开命令行并键入

at /?
进入终点站。一个缺点是远程系统上的时间需要在您的合理增量之内。它也不是即时的。您必须等待几秒钟,以确保远程计划程序不会完全错过该事件

有一个与此等效的WMI,其基本注意事项与:

清单3:在WindowsServer2003、WindowsXP和Win2kSP3机器上创建交互式进程的代码

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执行远程进程

  • 使用WMI

  • 代码项目示例

  • 示例使用自定义凭据执行&远程可执行文件是Win Form应用程序。
    希望这能有所帮助。

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

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

    我看到您提到了以交互方式运行应用程序的问题。我建议使用/I开关以交互方式运行应用程序。PSTools提供了您需要的所有功能。你只需要摆弄一下开关就可以得到你想要的结果


    我从未体验过您在我使用PSTools的应用程序中描述的缓慢

    我可以问一下为什么从进程需要GUI吗?我有一个类似的设置,但仅在初始设置期间需要GUI

    不管怎样,这里是我所做的,但不幸的是,它依赖于作为LocalSystem帐户运行的进程,我知道如果您真的需要GUI,您正试图避免使用LocalSystem帐户

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

    我所做的是通过使用sc.exe(这是一个正确的PITA,幸运的是您只做了一次)在从机上将从机应用程序设置为服务。大致如下:

    sc.exe create SlaveService binPath= c:\path\to\slave.exe type= interact DisplayName= "The Slave Service"
    
    注意参数(binPath=etc)后面的空格,这些是必需的。还请注意,我发现删除“type=interact”并在服务控制台中手动更改它更容易

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

    sc.exe \\slavemachine start SlaveService
    
    并验证程序是否在从机上运行

    现在在我的例子中,除了最初的故障排除,我并不真正需要GUI。一旦一切正常运行,我就将服务配置为作为服务帐户运行,但不再以交互模式运行


    我希望这对您有所帮助。

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

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

    其次,您需要在远程机器上安装一些可以启动应用程序的监听设备

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


    PsExec看起来是最有前途的现成解决方案。否则,您可以通过TCP/named pipes/任何方式启动自己的应用程序来监听简单消息,并生成相应的子进程。唯一需要注意的是,在安全性方面要非常小心,特别是当任何计算机公开时。

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

    当我尝试PsExec时,速度非常慢(不确定原因),并且不能正常工作。GUI应用程序将是l