代码之家  ›  专栏  ›  技术社区  ›  gix

在Windows网络中启动远程进程

  •  7
  • gix  · 技术社区  · 17 年前

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

    我的第一个想法是使用wmi和win32_process类来启动远程进程,但是经过进一步的调查发现,以这种方式启动的进程是非交互和独立的,因此不能有任何GUI。一个说明说,可以使用win32_scheduledjob.create创建远程交互进程,但它在本地系统帐户下运行,我想避免这种情况(而且我甚至无法使其正常运行)。

    解决这个问题的好方法是什么? 也许可以启动一个助手应用程序,该应用程序反过来启动一个适当的过程,但这看起来很不好。

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

    8 回复  |  直到 13 年前
        1
  •  6
  •   Ryu    16 年前

    psexec是可以做到这一点的SysInternals套件的一部分

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

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

    Terminal Services Remote App

        2
  •  1
  •   Christopher    16 年前

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

    我认为大多数其他方法(不安装您自己的服务)已经被各种服务包关闭,因为存在漏洞。

        3
  •  1
  •   Ganesh R.    16 年前

    以下两个post使用.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窗体应用程序。 希望这有帮助。

        4
  •  1
  •   MSalters    16 年前

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

        5
  •  1
  •   Jack Leow    16 年前

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

    不管怎样,这里是我所做的,但不幸的是,它依赖于作为本地系统帐户运行的进程,我知道如果您真的需要GUI,您正试图避免这种情况。

    为了给你一点背景知识,我必须分发的应用程序是 Hudson 这是一个较早的版本,在这里你发布它的方式是运行一个Java WebStat应用程序,因此需要一个GUI(至少在设置过程中,帮助解决故障)。

    我所做的是使用sc.exe(这是一个正确的pita,幸运的是您只做一次)在从属计算机上设置从属应用程序作为服务。沿着这条线的东西:

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

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

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

    sc.exe \\slavemachine start SlaveService
    

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

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

    我希望你觉得这有帮助。

        6
  •  1
  •   kyoryu    16 年前

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

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

    第二,您需要在远程机器上监听一些可以启动应用程序的内容。

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

    PSExec看起来是最有前途的开箱即用解决方案。否则,您可以滚动自己的应用程序,通过tcp/named pipes/whatever来监听简单的消息,并生成适当的子进程。唯一需要注意的是,您需要非常小心地保护安全,尤其是当任何一台机器被公开时。

        7
  •  0
  •   slypete    16 年前

    pstools套件是由SysInternals开发的,非常棒,微软后来收购了这家公司。使用这些工具是完成任务的最佳方式。

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

    我从来没有体验过你在我的应用程序中描述的使用pstool的缓慢。

        8
  •  0
  •   Jim Hunziker    14 年前

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

    推荐文章