7

Posiadam kilka maszyn slave i master, które razem uruchamiają aplikację rozproszoną. Procesy na każdej maszynie slave muszą mieć GUI i dostęp do sieci (myślę, że wówczas nazywałoby się to procesem interaktywnym). Dla łatwości użycia byłoby dobrze, gdyby maszyna główna mogła uruchomić/zatrzymać procesy na tych maszynach slave.Uruchamianie zdalnych procesów w sieci Windows

Moim pierwszym pomysłem było wykorzystanie WMI i klasy Win32_Process do uruchomienia zdalnego procesu, ale po dalszych badaniach odkryto, że procesy rozpoczęte w ten sposób są nieinteraktywne i izolowane, a zatem nie mogą mieć żadnego graficznego interfejsu użytkownika. Uwaga mówi, że można użyć Win32_ScheduledJob.Create do stworzenia zdalnego procesu interaktywnego, ale działa on pod kontem LocalSystem, którego chciałbym uniknąć (również nie mogłem go uruchomić).

Jakie są dobre sposoby rozwiązania tego problemu? Może jest możliwe uruchomienie aplikacji pomocniczej, która z kolei rozpoczyna prawidłowy proces, ale to wydaje się dość brudne.

Edytuj: PsExec był naprawdę niezgrabny, gdy próbowałem go i powoli jak cholera (nie wiem dlaczego). Patrząc dalej na PsExec wydaje się, że instaluje tymczasową usługę na zdalnym komputerze, aby uruchomić aplikację. Czy byłby to jedyny sposób na stworzenie interaktywnego procesu z wykorzystaniem właściwej tożsamości? Czy powinienem dołączyć usługę pomocniczą w konfiguracji dla węzłów? Ale nawet wtedy, skąd miałbym się z tym porozumieć?

Odpowiedz

6

PsExec jest częścią pakietu Sysinternals, że może to zrobić

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

Jeśli serwery z systemem Windows 2008 można również użyć

Terminal Services Remote App

+0

Kiedy próbowałem PsExec, było dość powolne (nie wiem dlaczego) i nie działało poprawnie. Aplikacje GUI będą uruchamiane, pod odpowiednim kontem, będą widoczne na pasku zadań, ale rzeczywisty GUI nigdy nie był aktualizowany i widoczny był tylko martwy "blok". – gix

1

można użyć „na " dowództwo.

Otwórz wiersz poleceń i wpisz

at /? 

do terminala. Jedyną wadą jest to, że czas na zdalnym systemie musi być w granicach rozsądnej delty. To także nie jest natychmiastowe. Musisz poczekać kilka sekund, aby upewnić się, że zdalny program planujący całkowicie nie ominie zdarzenia.

Jest WMI równoważne z tym, i ma te same podstawowe zastrzeżenia, jak w:

Listing 3: Kod do tworzenia interaktywnego procesu w systemie Windows Server 2003, Windows XP i Win2k SP3 Maszyna

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 

Myślę, że większość innych sposobów na zrobienie tego (bez instalowania własnej usługi) zostało wyłączonych przez różne dodatki Service Pack ze względu na luki w zabezpieczeniach.

1

Jeśli grupa podszytowa znajduje się pod Twoją kontrolą, możliwe jest wdrożenie tych zdalnych procesów jako Usługi systemu Windows. Usługa może być interaktywna (nie domyślnie) i może być zdalnie sterowana za pomocą standardowego Menedżera kontroli usług działającego na każdym komputerze z systemem Windows.

+0

Czy jesteś pewien, że usługa może być interaktywna? Mam usługę, z którą komunikuję się poprzez hangfire, na maszynie wirtualnej z serwerem Windows 2012 i nie mogę uruchomić usługi interaktywnie ... – EluciusFTW

+0

@EluciusFTW: Nie można uzyskać losowych usług do uruchomienia interaktywnego, ale tutaj na StackOverflow I Zakładam, że zwracam się do programisty usługi. – MSalters

+0

Chcę, aby moja usługa napisana w języku C# przy użyciu TopShelf) działała interaktywnie. Jakieś pomysły? Zobacz tutaj: http://stackoverflow.com/questions/39721393/service-does-not-execute-command-on-windows-server-2012 – EluciusFTW

0

Pakiet PSTools został opracowany przez Sysinternals i był tak wielki, że firma została zakupiona przez Microsoft jakiś czas później. Korzystanie z tych narzędzi jest najlepszym sposobem na wykonanie zadania.

Widzę, że wspomniałeś o problemie z interaktywnym uruchamianiem aplikacji. Mogę zaproponować użycie przełącznika/i do interaktywnego uruchomienia aplikacji. PSTools oferuje całą funkcjonalność, której szukasz. Musisz tylko bawić się przełącznikami, aby uzyskać pożądany rezultat.

Nigdy nie doświadczyłem spowolnienia opisanego w moich aplikacjach, które używają PSTools.

1

Czy mogę zapytać, dlaczego procesy niewolnicze muszą mieć GUI? Mam podobną konfigurację, ale potrzebowałem GUI tylko podczas początkowej konfiguracji.

W każdym razie, oto co zrobiłem, ale niestety polega on na uruchomieniu procesu jako konto LocalSystem, co, jak rozumiem, próbujesz uniknąć, jeśli naprawdę potrzebujesz GUI.

Aby dać trochę tła, stosowanie miałem do dystrybucji był Hudson, a ta była wcześniejsza wersja, gdzie sposób rozpowszechniać to uruchamiając aplikację Java Web Start, a tym samym zapotrzebowanie na GUI (przynajmniej podczas konfiguracji, aby pomóc w rozwiązywaniu problemów).

To, co zrobiłem, to skonfigurowanie aplikacji slave jako usług na maszynach slave za pomocą sc.exe (co jest PITA, aby uzyskać prawo, na szczęście robisz to tylko raz). Coś na wzór:

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

Należy zwrócić uwagę na spacje po parametrach (binPath = etc), które są konieczne. Zauważ też, że łatwiej jest upuścić "type = interact" i ręcznie zmienić go w konsoli serwisowej.

Następnie na mistrza, także korzystając Sc.exe, ja uruchomić usługę zdalnie:

sc.exe \\slavemachine start SlaveService 

I sprawdzeniu, że program został uruchomiony na komputerach slave.

Teraz w moim przypadku nie potrzebowałem GUI, poza początkowym rozwiązywaniem problemów. Jak tylko wszystko działa poprawnie, po prostu skonfigurowałem usługę do działania jako konto usługi, ale już nie w trybie interaktywnym.

Mam nadzieję, że okaże się to pomocne.

+0

Bardzo późna odpowiedź * kaczka *. Procesy wymagały GUI, ponieważ była to wizualizacja na wielu komputerach i wyświetlaczach (powerwall). – gix

1

Jest kilka elementów, które będą potrzebne, aby tak się stało.

Najpierw potrzebna jest metoda komunikacji ze zdalnym komputerem.

Po drugie, potrzebujesz czegoś na słuchanie przez urządzenie zdalne, które może uruchomić aplikację.

Inne sugestie dotyczą przede wszystkim czegoś wbudowanego w jeden lub oba te elementy, co jest w porządku, o ile ograniczenia któregokolwiek z podanych rozwiązań są odpowiednie.

PsExec wygląda jak najbardziej obiecujące, gotowe do użycia rozwiązanie. W przeciwnym razie możesz uruchomić własną aplikację, aby słuchać prostych wiadomości przez TCP/nazwane potoki/cokolwiek i po prostu odradzać odpowiednie podprocesy. Jedynym zastrzeżeniem jest to, że chcesz zachować ostrożność w zakresie bezpieczeństwa, szczególnie jeśli którykolwiek z komputerów jest publicznie dostępny.

0

jest często używany w klastrach obliczeniowych o wysokiej wydajności i powinien być w stanie robić to, co chcesz. Nawet jeśli nie użyjesz go do przekazywania komunikatów między maszynami, możesz użyć jego programu uruchamiającego proces, aby rozpocząć wszystkie procesy od maszyny głównej. Można go skonfigurować do uwierzytelniania jako określony użytkownik systemu Windows na komputerach.

Powiązane problemy