7

Tengo varias máquinas esclavas y una máquina maestra que juntas ejecutan una aplicación distribuida. Los procesos en cada máquina esclava deben tener una GUI y acceso a la red (creo que entonces se llamaría un proceso interactivo). Para facilitar el uso, sería bueno que la máquina maestra pudiera iniciar/detener los procesos en esas máquinas esclavas.Inicio de procesos remotos en una red de Windows

Mi primera idea fue utilizar WMI y la clase Win32_Process para iniciar un proceso remoto, pero luego de una investigación adicional se descubrió que los procesos iniciados de esta manera no son interactivos y están aislados, y por lo tanto no pueden tener ninguna GUI. Una nota dice que uno puede usar Win32_ScheduledJob.Create para crear un proceso interactivo remoto, pero se ejecuta bajo la cuenta LocalSystem que me gustaría evitar (ni siquiera pude ejecutarlo correctamente).

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

Editar: PsExec era realmente torpe cuando lo probé y lento como el infierno (no estoy seguro de por qué). Si miramos más a PsExec, parece que instala un servicio temporal en la máquina remota para iniciar la aplicación. ¿Esta sería la única forma de engendrar un proceso interactivo utilizando una identidad adecuada? ¿Debo incluir un servicio auxiliar en la configuración de los nodos? Pero incluso entonces, ¿cómo me comunicaría con eso?

Respuesta

6

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

Terminal Services Remote App

+0

Cuando probé PsExec fue bastante lento (no estoy seguro de por qué) y no funcionó correctamente. Las aplicaciones de interfaz gráfica de usuario se iniciarían, con la cuenta correcta, se podrían ver en la barra de tareas, pero la GUI actual nunca se actualizó y solo se vio un "bloque" muerto. – gix

1

Usted puede utilizar el "en "comando".

Abrir una línea de comandos y el tipo

at /? 

en el terminal. El único inconveniente es que el tiempo en el sistema remoto debe estar dentro de un delta razonable suyo. Tampoco es instantáneo. Tienes que esperar unos segundos para asegurarte de que el programador remoto no se pierda por completo el evento.

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 instalar su propio servicio) han sido desactivadas por varios service packs debido a las vulnerabilidades.

1

Si el grupo enire está razonablemente bajo su control, es posible implementar estos procesos remotos como Servicios de Windows. Un servicio puede ser interactivo (aunque no por defecto) y se puede controlar de forma remota a través del Service Control Manager estándar que se ejecuta en cada PC con Windows.

+0

¿Estás seguro de que un servicio puede ser interactivo? Tengo un servicio con el que me comunico mediante hangfire, en una máquina virtual que ejecuta el servidor de Windows 2012, y no puedo hacer que el servicio se ejecute de forma interactiva ... – EluciusFTW

+0

@EluciusFTW: No se pueden obtener servicios aleatorios para ejecutar interactivos, pero aquí en StackOverflow I Supongo que me dirijo al desarrollador de un servicio. – MSalters

+0

Deseo obtener mi servicio auto escrito (escrito en C# usando TopShelf) para ejecutar de forma interactiva. ¿Algunas ideas? Vea aquí: http://stackoverflow.com/questions/39721393/service-does-not-execute-command-on-windows-server-2012 – EluciusFTW

0

La suite PSTools fue desarrollada por Sysinternals y fue tan genial que la empresa fue comprada por Microsoft un tiempo después. Usar estas herramientas es la mejor manera de lograr su tarea.

Veo que mencionó un problema al ejecutar aplicaciones de forma interactiva. Puedo sugerir usar el modificador/i para ejecutar la aplicación de forma interactiva. PSTools ofrece toda la funcionalidad que está buscando. Solo necesita jugar con los interruptores para obtener el resultado deseado.

Nunca he experimentado la lentitud que describes en mis aplicaciones que usan PSTools.

1

¿Puedo preguntar por qué los procesos esclavos necesitan tener una GUI? Tengo una configuración similar, pero necesitaba una GUI solo durante la configuración inicial.

De todos modos, esto es lo que he hecho, pero lamentablemente se basa en el proceso que se ejecuta como la cuenta LocalSystem, que entiendo que está tratando de evitar, si realmente necesita la GUI.

Para darle un poco de información, la aplicación que tuve que distribuir era Hudson, y esta era una versión anterior donde la forma de distribuirla es ejecutando una aplicación Java WebStart, y por lo tanto la necesidad de una GUI (al menos durante la configuración, para ayudar a la resolución de problemas).

Lo que hice fue configurar las aplicaciones esclavas como servicios en las máquinas esclavas mediante el uso de sc.exe (que es un PITA para hacerlo bien, afortunadamente solo lo hace una vez). Algo similar a:

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), son necesarios. Tenga en cuenta también que me pareció más fácil soltar el "tipo = interactuar" y cambiarlo 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 verificó que el programa se ejecuta en los equipos esclavos.

Ahora en mi caso, realmente no necesitaba la GUI, excepto para la solución de problemas inicial. Tan pronto como logré que todo funcionara correctamente, simplemente configuré el servicio para que se ejecutara como una cuenta de servicio, pero ya no esté en modo interactivo.

Espero que encuentre esto útil.

+0

Muy tarde la respuesta * pato *. Los procesos necesitaban una GUI porque esta era una visualización en varias máquinas y pantallas (powerwall). – gix

1

Hay un par de componentes que necesitará para que esto suceda.

Primero, necesitará un método de comunicación con la máquina remota.

En segundo lugar, necesitará algo en la máquina remota para escuchar que puede iniciar su aplicación.

Las otras sugerencias usan algo incorporado para uno o ambos componentes, lo cual está bien, siempre que las restricciones de cualquiera de las soluciones dadas sean apropiadas.

PsExec parece la solución más prometedora y lista para usar. De lo contrario, puede rodar su propia aplicación para escuchar mensajes simples a través de TCP/named pipes/whatever y simplemente generar los subprocesos apropiados. La única advertencia es que debes tener mucho cuidado con la seguridad, especialmente si alguna de las máquinas está expuesta públicamente.

0

MPICH2 se usa a menudo en clústeres de computación de alto rendimiento y debe poder hacer lo que desee. Incluso si no lo usa para pasar mensajes entre máquinas, puede usar su iniciador de procesos para iniciar todos los procesos desde la máquina maestra. Se puede configurar para autenticarse como un usuario de Windows particular en las máquinas.

Cuestiones relacionadas