7

Ich habe mehrere Slave-Maschinen und eine Master-Maschine, die zusammen eine verteilte Anwendung ausführen. Prozesse auf jeder Slave-Maschine müssen eine GUI und einen Netzwerkzugriff haben (ich denke, es würde dann als interaktiver Prozess bezeichnet). Zur Vereinfachung der Bedienung wäre es schön, wenn die Master-Maschine die Prozesse auf diesen Slave-Maschinen starten/stoppen könnte.Starten von Remote-Prozessen in einem Windows-Netzwerk

Meine erste Idee war, WMI und die Win32_Process-Klasse zu verwenden, um einen Remote-Prozess zu starten, aber bei weiteren Untersuchungen wurde gemeldet, dass Prozesse auf diese Weise nicht interaktiv und isoliert sind und daher keine GUI haben können. Ein Hinweis besagt, dass man Win32_ScheduledJob.Create verwenden kann, um einen interaktiven Remote-Prozess zu erstellen, aber er läuft unter dem LocalSystem-Konto, das ich vermeiden möchte (auch ich konnte es nicht einmal richtig laufen lassen).

Was wären gute Möglichkeiten, um dieses Problem zu lösen? Vielleicht ist es möglich, eine Hilfsanwendung zu starten, die wiederum einen korrekten Prozess startet, aber das scheint ziemlich schmutzig.

Edit: PsExec war wirklich klobig, wenn ich es versuchte und langsam wie die Hölle (nicht sicher warum). Mit Blick auf PsExec scheint es einen temporären Dienst auf dem Remote-Rechner installiert zu haben, um die Anwendung zu starten. Wäre dies der einzige Weg, einen interaktiven Prozess mit einer richtigen Identität zu erzeugen? Soll ich einen Helferdienst in das Setup für die Knoten aufnehmen? Aber selbst dann, wie würde ich dann damit kommunizieren?

Antwort

6

PsExec ist Teil der Sysinternals Suite, die tun kann, dass

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

Wenn Ihre Server mit Windows 2008 auch

Terminal Services Remote App

+0

Als ich PsExec ausprobierte, war es ziemlich langsam (nicht sicher warum) und funktionierte nicht ganz richtig. GUI-Apps würden gestartet werden, unter dem richtigen Konto, könnte in der Taskleiste gesehen werden, aber die tatsächliche GUI nie aktualisiert und nur eine tote "Block" war sichtbar. – gix

1

Sie können die „verwenden, verwenden können " Befehl.

Öffnen Sie eine Befehlszeile und geben Sie

at /? 

in das Terminal. Der einzige Nachteil ist, dass die Zeit auf dem Remote-System in einem vernünftigen Delta von Ihnen sein muss. Es ist auch nicht sofort. Sie müssen einige Sekunden warten, um sicherzustellen, dass der Remote-Scheduler das Ereignis nicht vollständig verpasst.

Es ist ein WMI-Äquivalent dazu und hat die gleichen grundlegenden Einschränkungen wie bei:

LISTING 3: Code einen interaktiven Prozess zu erstellen, die auf Windows Server 2003, Windows XP und Win2K SP3 Maschinen

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 

Ich denke, die meisten anderen Möglichkeiten (ohne die Installation eines eigenen Dienstes) wurden von verschiedenen Service Packs aufgrund von Schwachstellen deaktiviert.

1

Wenn die enire-Gruppe einigermaßen unter Ihrer Kontrolle ist, können diese Remote-Prozesse möglicherweise als Windows-Dienste implementiert werden. Ein Dienst kann interaktiv sein (nicht standardmäßig) und kann über den Standard-Dienststeuerungs-Manager, der auf jedem Windows-PC ausgeführt wird, ferngesteuert werden.

+0

Sind Sie sicher, dass ein Dienst interaktiv sein kann? Ich habe einen Dienst, mit dem ich über Hangfire auf einer VM mit Windows Server 2012 kommunizieren, und ich kann den Dienst nicht interaktiv ausführen ... – EluciusFTW

+0

@EluciusFTW: Sie können nicht zufällig Dienste interaktiv ausführen, aber hier auf StackOverflow I gehe davon aus, dass ich den Entwickler eines Dienstes anspreche. – MSalters

+0

Ich möchte meinen selbst geschriebenen Dienst (in C# mit TopShelf geschrieben) interaktiv ausführen lassen. Irgendwelche Ideen? Siehe hier: http://stackoverflow.com/questions/39721393/service-does-not-execute-command-on-windows-server-2012 – EluciusFTW

0

Die PSTools-Suite wurde von Sysinternals entwickelt und war so großartig, dass das Unternehmen später von Microsoft gekauft wurde. Die Verwendung dieser Tools ist der beste Weg, um Ihre Aufgabe zu erfüllen.

Ich sehe, dass Sie ein Problem mit dem Ausführen von Anwendungen interaktiv erwähnt. Darf ich vorschlagen, die Option/i zu verwenden, um die Anwendung interaktiv auszuführen. PSTools bietet alle Funktionen, die Sie suchen. Sie müssen nur mit den Schaltern herumspielen, um das gewünschte Ergebnis zu erhalten.

Ich habe nie die Langsamkeit erlebt, die Sie in meinen Anwendungen beschreiben, die PSTools verwenden.

1

Darf ich fragen, warum die Slave-Prozesse eine GUI haben müssen? Ich habe eine ähnliche Einrichtung, aber brauchte nur während der ersten Einrichtung eine GUI.

Wie auch immer, hier ist, was ich getan habe, aber leider verlässt es sich auf den Prozess als LocalSystem-Konto, das ich verstehe, dass Sie versuchen zu vermeiden, wenn Sie wirklich die GUI benötigen.

Um Ihnen ein wenig Hintergrundwissen zu geben, war die Anwendung, die ich verteilen musste, Hudson, und dies war eine frühere Version, wo Sie eine Java WebStart-Anwendung verteilen und somit eine GUI benötigen (zumindest während der Einrichtung, um die Fehlerbehebung zu erleichtern).

Was ich getan habe, war die Slave-Anwendungen als Dienste auf den Slave-Maschinen mit Hilfe von sc.exe eingerichtet (was ein PITA ist, um richtig zu machen, zum Glück tun Sie dies nur einmal). Etwas in der Form von:

Beachten Sie die Leerzeichen nach den Parametern (binPath = etc), diese sind notwendig. Beachten Sie auch, dass es einfacher war, "type = interact" zu löschen und manuell in der Servicekonsole zu ändern.

Dann auf dem Master, auch sc.exe verwenden, starten Sie den öffentlichen Dienst der Ferne:

sc.exe \\slavemachine start SlaveService 

Und Nachweis erbracht, dass das Programm auf den Slave-Maschinen ausgeführt wurde.

Jetzt in meinem Fall, ich brauchte nicht wirklich die GUI, außer für die erste Fehlersuche. Sobald alles richtig läuft, habe ich den Dienst einfach so konfiguriert, dass er als Dienstkonto ausgeführt wird, aber nicht mehr im interaktiven Modus.

Ich hoffe, Sie finden das hilfreich.

+0

Sehr späte Antwort * Ente *. Die Prozesse benötigten eine GUI, da dies eine Visualisierung über mehrere Maschinen und Displays (Powerwall) hinweg war. – gix

1

Es gibt ein paar Komponenten, die Sie benötigen, um dies zu ermöglichen.

Zuerst benötigen Sie eine Methode der Kommunikation mit dem Remote-Computer.

Zweitens benötigen Sie etwas auf der Remote-Maschine hören, die Ihre Anwendung starten kann.

Die anderen Vorschläge verwenden vor allem etwas eingebaut für eine oder beide dieser Komponenten, was in Ordnung ist, solange die Einschränkungen einer der gegebenen Lösungen angemessen sind.

PsExec scheint die vielversprechendste Out-of-the-Box-Lösung zu sein. Andernfalls können Sie Ihre eigene App rollen, um einfache Nachrichten über TCP/Named Pipes/was auch immer zu hören und entsprechende Sub-Prozesse zu erzeugen. Der einzige Vorbehalt dabei ist, dass Sie bei der Sicherheit vorsichtig sein müssen, besonders wenn einige der Maschinen öffentlich zugänglich sind.

0

MPICH2 wird oft in High Performance Computing-Clustern verwendet und sollte in der Lage zu tun, was Sie wollen. Auch wenn Sie es nicht für die Weitergabe der Nachrichten zwischen Rechnern verwenden, können Sie mit dem Prozess-Launcher alle Prozesse vom Master-Rechner aus starten. Es kann so eingerichtet werden, dass es sich als bestimmter Windows-Benutzer auf den Computern authentifiziert.