Pregunta

Tengo varias máquinas de esclavos y una máquina principal, que juntos ejecutar una aplicación distribuida. Los procesos en cada equipo esclavo tiene que tener una interfaz gráfica de usuario y la red de acceso (creo que se llama un proceso interactivo a continuación). Para facilitar su uso, sería bueno si la máquina maestra podría iniciar / detener los procesos en esas máquinas esclavas.

Mi primera idea fue utilizar WMI y la clase Win32_Process para iniciar un proceso remoto, pero tras una investigación complementaria se reveiled que los procesos comenzaron esta manera son no interactivo y aislada, y por lo tanto no puede tener ninguna interfaz gráfica de usuario. Una nota dice que uno puede usar para crear Win32_ScheduledJob.Create un proceso interactivo a distancia, pero se ejecuta bajo la cuenta LocalSystem, que me gustaría evitar (también ni siquiera podía conseguir que se ejecute correctamente).

¿Cuál sería una buena manera de resolver este problema? Tal vez es posible lanzar una aplicación de ayuda que a su vez se inicia un proceso adecuado, pero que parece bastante sucia.

Editar: PsExec era muy torpe cuando lo probé y lento como el infierno (no sé por qué). Mirando más en PsExec parece que se instale un servicio temporal en la máquina remota para iniciar la aplicación. ¿Sería esta la única manera de generar un proceso interactivo utilizando una identidad propia? ¿Debo incluir un servicio de ayuda en la configuración de los nodos? Pero incluso entonces, ¿cómo iba a comunicar con él, entonces?

¿Fue útil?

Solución

PsExec es parte de la suite sysinternals que puede hacer eso

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

Si los servidores ejecutan Windows 2008 también se puede utilizar

Servicios de Terminal Remota App

Otros consejos

Puede utilizar el comando "AT".

Abra una línea de comandos y escriba

at /?

en el terminal. El único inconveniente es que el tiempo en el sistema remoto tiene que estar dentro de algún delta razonable de los suyos. Tampoco es instantánea. Usted tiene que esperar unos segundos para asegurarse de que el programador a distancia no se pierda el evento por completo.

Hay un WMI equivalente a este, y tiene las mismas advertencias básicas como en:

Listado 3: Código para crear un proceso interactivo en Windows Server 2003, Windows XP y Win2K SP3 Máquinas

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

Creo que la mayoría de las otras formas de hacerlo (sin necesidad de instalar su propio servicio) se han desactivado por varios paquetes de servicio a causa de vulnerabilidades.

La siguiente dos post uso .NET para ejecutar procesos remotos.

  1. Uso de WMI

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

  2. CodeProject Ejemplo

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

Los ejemplos ejecutan con credenciales personalizadas y el ejecutable a distancia es una aplicación Win Form. Espero que esto ayude.

Si el grupo enire es razonablemente bajo su control, puede ser posible llevar a cabo estos procesos remotos como servicios de Windows. Un servicio puede ser interactivo (no por defecto, aunque) y que puede ser controlado remotamente a través del Administrador de control de servicios estándar que se ejecuta en cada PC con Windows.

¿Puedo preguntar por qué los procesos esclavos necesita tener una interfaz gráfica de usuario? Tengo un conjunto similar, pero necesitaba una interfaz gráfica de usuario sólo durante la configuración inicial.

De todos modos, esto es lo que he hecho, pero por desgracia, se basa en el proceso que se ejecuta como la cuenta LocalSystem, que entiendo que usted está tratando de evitar, en lo que realmente necesita la interfaz gráfica de usuario.

Para darle un poco de antecedentes, la aplicación tenía que distribuir era Hudson , y esto era una versión anterior en la forma en que se distribuya es mediante la ejecución de una aplicación Java Web Start, y por lo tanto la necesidad de una interfaz gráfica de usuario (fije al menos durante arriba, para ayudar a la resolución de problemas).

Lo que hice fue creado las aplicaciones de esclavos como los servicios en las máquinas de esclavos mediante el uso de sc.exe (que es un PITA para hacerlo bien, por suerte sólo hacer esto una vez). Algo a lo largo de las líneas de:

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

Tenga en cuenta los espacios después de los parámetros (= binpath etc.), los que son necesarios. Tenga en cuenta también que me pareció más fácil dejar caer la "type = interactuar" y cambiar manualmente en la consola de servicio.

A continuación, en el maestro, utilizando también sc.exe, comienzo del servicio de forma remota:

sc.exe \\slavemachine start SlaveService

Y verificado que el programa se ejecuta en los equipos esclavos.

Ahora, en mi caso, yo realmente no necesito la interfaz gráfica de usuario, que no sea para la solución de problemas inicial. Tan pronto como llegué todo funcione correctamente, simplemente configurado el servicio para ejecutarse como una cuenta de servicio, pero ya no está en el modo interactivo.

Espero que encuentre útil esta información.

Hay un par de componentes que vas a necesitar para que esto suceda.

En primer lugar, se necesita un método de comunicación con la máquina remota.

En segundo lugar, necesitará algo en la escucha de la máquina remota que puede iniciar la aplicación.

Las otras sugerencias sobre todo usan algo incorporado para uno o ambos de estos componentes, lo cual está bien, siempre y cuando las restricciones de ninguna de las soluciones dadas son apropiadas.

PsExec parece la solución más prometedora, fuera de la caja. De lo contrario, puede rodar su propia aplicación para escuchar los mensajes sencillos a través de TCP / canalizaciones con nombre / lo que sea y solo desovan sub-procesos apropiados. La única advertencia con esto es que querrá ser bastante cuidado alrededor de la seguridad, especialmente si alguna de las máquinas están expuestos públicamente.

La suite PSTools fue desarrollado por Sysinternals y era tan grande que la compañía fue comprada por Microsoft algún tiempo después. El uso de estas herramientas es la mejor manera de llevar a cabo su tarea.

Veo que usted ha mencionado un problema con la ejecución de aplicaciones de forma interactiva. ¿Puedo sugerir utilizando el modificador / i para ejecutar la aplicación interactiva. PSTools ofrece toda la funcionalidad que busca. Sólo tiene que jugar un poco con los interruptores para obtener el resultado deseado.

Nunca he experimentado la lentitud que usted describe en mis aplicaciones que utilizan PSTools.

MPICH2 se utiliza a menudo en grupos de computación de alto rendimiento y debe ser capaz a hacer lo que quiera. Incluso si usted no lo utiliza para pasar los mensajes entre máquinas, puede utilizar su lanzador proceso para iniciar todos los procesos desde la máquina principal. Puede ser configurado para autenticar como un usuario de Windows en las máquinas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top