Pergunta

I têm várias máquinas escravas e uma máquina de mestre que em conjunto formam uma aplicação distribuída. Processos em cada máquina escravo tem que ter um acesso GUI e rede (acho que seria chamado de um processo interativo, em seguida). Para facilidade de uso que seria bom se a máquina mestre pode iniciar / parar os processos sobre essas máquinas escravas.

A minha primeira idéia era usar classe WMI eo Win32_Process para iniciar um processo remoto, mas em cima de uma investigação mais aprofundada foi reveiled que os processos iniciados desta forma são não-interativo e isolado, e, portanto, não pode ter qualquer GUI. A nota diz que se pode usar Win32_ScheduledJob.Create para criar um processo interativo remoto, mas ele é executado sob a conta do sistema local que eu gostaria de evitar (também eu não poderia mesmo fazê-lo funcionar corretamente).

O que seria boas maneiras de resolver este problema? Talvez seja possível lançar um aplicativo auxiliar que por sua vez inicia um processo adequado, mas que parece muito sujo.

Edit: PsExec foi realmente desajeitado quando eu tentei e lento como o inferno (não sei porquê). Olhando mais em PsExec parece que instala um serviço temporário na máquina remota para iniciar a aplicação. Seria esta a única maneira de gerar um processo interativo usando uma identidade própria? Devo incluir um serviço auxiliar na configuração para os nós? Mas, mesmo assim, como eu ia comunicar com ele, então?

Foi útil?

Solução

PsExec é parte do conjunto sysinternals que pode fazer isso

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

Se os servidores estão executando o Windows 2008 você também pode usar

Terminal Services remoto App

Outras dicas

Você pode usar o comando "at".

Abra uma linha de comando e digite

at /?

Dentro do terminal. A única desvantagem é que o tempo no sistema remoto precisa estar dentro de algum delta razoável de seu. Também não é instantânea. Você tem que esperar alguns segundos para garantir que o programador remoto não perder o evento completo.

Há um WMI equivalente a este, e tem as mesmas ressalvas básicas como em:

A Listagem 3: código para criar um processo interativo no Windows Server 2003, Windows XP e Win2K SP3 Machines

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

Eu acho que a maioria das outras maneiras de fazê-lo (sem instalar o seu próprio serviço) ter sido desligado por vários pacotes por causa de vulnerabilidades de serviços.

A seguir dois post uso .NET para executar processos remotos.

  1. Usando WMI

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

  2. codeproject Exemplo

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

Os exemplos executar com credenciais personalizadas e o executável remoto é um aplicativo Win Form. Espero que isso ajude.

Se o grupo enire é razoavelmente sob o seu controle, pode ser possível implementar esses processos remotos como Windows Services. Um serviço pode ser interativo (não por padrão embora) e pode ser controlado remotamente via o padrão Service Control Manager em execução em cada PC com Windows.

Posso perguntar por que os processos escravos precisa ter um GUI? Eu tenho um conjunto semelhante, mas precisava de um GUI apenas durante a configuração inicial.

De qualquer forma, aqui está o que eu fiz, mas infelizmente ele depende do processo em execução como a conta LocalSystem, que eu entendo que você está tentando evitar, se você realmente precisa do GUI.

Para lhe dar um pouco de fundo, a aplicação que eu tinha para distribuir WAS Hudson , e este era uma versão anterior, onde a maneira de distribuí-lo é através da execução de um aplicativo Java WebStart, e, portanto, a necessidade de um GUI (pelo menos durante a configuração, para ajudar a solucionar problemas).

O que eu fiz foi criar as aplicações de escravos como serviços nas máquinas escravas usando sc.exe (que é um PITA para obter direito, felizmente só fazer isso uma vez). Algo ao longo das linhas de:

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

Observe os espaços após os parâmetros (binPath = etc), esses são necessárias. Note também que eu achei mais fácil de largar o "type = interagem" e manualmente alterá-lo no console de serviço.

Em seguida, no mestre, também usando sc.exe, eu iniciar o serviço remotamente:

sc.exe \\slavemachine start SlaveService

E verificou-se que o programa foi executado em máquinas escravas.

Agora, no meu caso, eu realmente não precisa do GUI, que não seja para solução de problemas inicial. Assim que eu tenho tudo funcionando corretamente, eu simplesmente configurado o serviço para ser executado como uma conta de serviço, mas não no modo interativo.

Eu espero que você encontrar este útil.

Há um par de componentes que você está indo a necessidade de fazer isso acontecer.

Primeiro, você precisará de um método de comunicação com a máquina remota.

Em segundo lugar, você precisa de algo na escuta máquina remota que pode iniciar seu aplicativo.

As outras sugestões acima todo o uso algo embutido para um ou ambos destes componentes, o que é bom, desde que as restrições de qualquer das soluções dadas são adequadas.

PsExec parece que a solução mais promissora out-of-the-box. Caso contrário, você pode lançar seu próprio aplicativo para ouvir as mensagens simples via / pipes nomeados / whatever e apenas desova sub-processos apropriados TCP. A única ressalva com isso é que você vai querer ter segurança em torno muito cuidado, especialmente se qualquer uma das máquinas estão expostos ao público.

O conjunto PsTools foi desenvolvido pela Sysinternals e foi tão grande que a empresa foi comprada pela Microsoft algum tempo depois. O uso dessas ferramentas é a melhor maneira de realizar sua tarefa.

Eu vejo que você mencionou um problema com o funcionamento de aplicações de forma interativa. Posso sugerir usando o parâmetro / i para executar o aplicativo de forma interativa. Pstools oferece todas as funcionalidades que você está procurando. Você só precisa brincar com as chaves para obter o resultado desejado.

Eu nunca experimentou a lentidão você descreve em meus aplicativos que usam pstools.

MPICH2 é frequentemente usado em clusters de computação de alto desempenho e deve ser capaz para fazer o que quiser. Mesmo se você não usá-lo para passar as mensagens entre máquinas, você pode usar seu lançador processo para iniciar todos os processos-se a partir da máquina mestre. Ele pode ser configurado para autenticar como um usuário específico do Windows nas máquinas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top