7

J'ai plusieurs machines esclaves et une machine maître qui exécutent ensemble une application distribuée. Les processus sur chaque machine esclave doivent avoir une interface graphique et un accès réseau (je pense que ce serait un processus interactif). Pour faciliter l'utilisation, il serait bon que la machine maître puisse démarrer/arrêter les processus sur ces machines esclaves. Ma première idée était d'utiliser WMI et la classe Win32_Process pour démarrer un processus distant, mais après une enquête plus approfondie, il a été révélé que les processus démarrés de cette manière sont non-interactifs et isolés, et ne peuvent donc avoir aucune interface graphique. Une note indique que l'on peut utiliser Win32_ScheduledJob.Create pour créer un processus interactif à distance, mais il fonctionne sous le compte LocalSystem que je voudrais éviter (aussi je ne pouvais même pas le faire fonctionner correctement).Démarrage de processus distants dans un réseau Windows

Quels seraient les bons moyens de résoudre ce problème? Peut-être qu'il est possible de lancer une application d'aide qui à son tour démarre un processus approprié, mais cela semble assez sale. Edit: PsExec était vraiment maladroit quand je l'ai essayé et ralentir comme l'enfer (je ne sais pas pourquoi). En regardant plus loin PsExec il semble qu'il installe un service temporaire sur la machine distante pour lancer l'application. Serait-ce le seul moyen de générer un processus interactif en utilisant une identité propre? Dois-je inclure un service d'assistance dans la configuration pour les nœuds? Mais même alors, comment pourrais-je communiquer avec alors?

Répondre

6

PsExec fait partie de la suite Sysinternals qui peut le faire

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

Si vos serveurs fonctionnant sous Windows 2008, vous pouvez également utiliser

Terminal Services Remote App

+0

Lorsque j'ai essayé PsExec, il était assez lent (je ne sais pas pourquoi) et ne fonctionnait pas correctement. Les applications GUI seraient lancées, sous le bon compte, pourrait être vu dans la barre des tâches, mais l'interface graphique réelle n'a jamais été mise à jour et seul un «bloc» mort était visible. – gix

1

Vous pouvez utiliser la fonction « à "commande.

Ouvrir une ligne de commande et tapez

at /? 

dans le terminal. Le seul inconvénient est que l'heure sur le système distant doit être dans un certain delta raisonnable de la vôtre. Ce n'est pas non plus instantané. Vous devez attendre quelques secondes pour vous assurer que le planificateur distant ne rate pas complètement l'événement.

Il y a un équivalent WMI à cela, et a les mêmes mises en garde de base comme à:

COTATION 3: Code pour créer un processus interactif sur Windows Server 2003, Windows XP et 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 

Je pense que la plupart des autres moyens de le faire (sans installer votre propre service) ont été désactivés par divers service packs en raison de vulnérabilités.

1

Si le groupe enire est raisonnablement sous votre contrôle, il peut être possible d'implémenter ces processus distants en tant que services Windows. Un service peut être interactif (mais pas par défaut) et peut être contrôlé à distance via le gestionnaire de contrôle des services standard s'exécutant sur chaque PC Windows.

+0

Etes-vous sûr qu'un service peut être interactif? J'ai un service avec lequel je communique via hangfire, sur une machine virtuelle exécutant le serveur Windows 2012, et je n'arrive pas à faire fonctionner le service de manière interactive ... – EluciusFTW

+0

@EluciusFTW: Vous ne pouvez pas obtenir des services aléatoires pour fonctionner de manière interactive, mais ici sur StackOverflow I Je suppose que je m'adresse au développeur d'un service. – MSalters

+0

Je souhaite que mon service auto-rédigé (écrit en C# avec TopShelf) s'exécute de manière interactive. Des idées? Voir ici: http://stackoverflow.com/questions/39721393/service-does-not-execute-command-on-windows-server-2012 – EluciusFTW

0

La suite PSTools a été développée par Sysinternals et était tellement géniale que la société a été achetée par Microsoft quelque temps plus tard. L'utilisation de ces outils est la meilleure façon d'accomplir votre tâche.

Je vois que vous avez mentionné un problème avec l'exécution interactive d'applications. Puis-je suggérer d'utiliser le commutateur/i pour exécuter l'application de manière interactive. PSTools offre toutes les fonctionnalités que vous recherchez. Vous avez juste besoin de jouer avec les commutateurs pour obtenir le résultat souhaité.

Je n'ai jamais ressenti la lenteur que vous décrivez dans mes applications qui utilisent PSTools.

1

Puis-je demander pourquoi les processus esclaves doivent avoir une interface graphique? J'ai une configuration similaire, mais j'avais besoin d'une interface graphique uniquement lors de la configuration initiale.

De toute façon, voici ce que j'ai fait, mais malheureusement, il repose sur le processus en cours d'exécution en tant que compte LocalSystem, ce que je comprends que vous essayez d'éviter, si vous avez vraiment besoin de l'interface graphique.

Pour vous donner un peu de contexte, l'application que j'ai dû distribuer était Hudson, et c'était une version antérieure où la façon dont vous le distribuez est en exécutant une application Java WebStart, et donc la nécessité d'une interface graphique (au moins pendant la configuration, pour aider au dépannage). Ce que j'ai fait a été de configurer les applications esclaves en tant que services sur les machines esclaves en utilisant sc.exe (qui est un PITA pour obtenir les bons résultats, heureusement que vous ne le faites qu'une seule fois). Quelque chose le long des lignes de:

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

Notez les espaces après les paramètres (binPath = etc), ceux-ci sont nécessaires. Notez également que j'ai trouvé plus facile de supprimer le "type = interagir" et de le changer manuellement dans la console de service.

Puis le maître, en utilisant également sc.exe, je commence le service à distance:

sc.exe \\slavemachine start SlaveService 

et vérifié que le programme était en cours d'exécution sur les machines esclaves. Maintenant, dans mon cas, je n'avais pas vraiment besoin de l'interface graphique, sauf pour le dépannage initial. Dès que tout fonctionnait correctement, j'ai simplement configuré le service pour qu'il fonctionne en tant que compte de service, mais plus en mode interactif.

J'espère que vous trouverez cela utile.

+0

Réponse très tardive * canard *. Les processus nécessitaient une interface graphique car il s'agissait d'une visualisation sur plusieurs machines et affichages (Powerwall). – gix

1

Voici quelques éléments dont vous aurez besoin pour y arriver. D'abord, vous aurez besoin d'une méthode de communication avec la machine distante. Deuxièmement, vous aurez besoin de quelque chose sur l'écoute de la machine distante qui peut démarrer votre application.

Les autres suggestions utilisent surtout quelque chose de intégré pour l'un ou l'autre de ces composants, ce qui est bien, tant que les restrictions de l'une des solutions données sont appropriées. PsExec ressemble à la solution la plus prometteuse, prête à l'emploi. Sinon, vous pouvez faire rouler votre propre application pour écouter des messages simples via TCP/named pipes/whatever et juste générer des sous-processus appropriés. Le seul inconvénient est que vous voudrez faire très attention à la sécurité, surtout si l'une des machines est exposée publiquement.

0

MPICH2 est souvent utilisé dans les clusters High Performance Computing et devrait être capable de faire ce que vous voulez. Même si vous ne l'utilisez pas pour transmettre les messages entre machines, vous pouvez utiliser son lanceur de processus pour démarrer tous les processus à partir de l'ordinateur maître. Il peut être configuré pour s'authentifier en tant qu'utilisateur Windows particulier sur les machines.