7

У меня есть несколько подчиненных машин и мастер-машина, которые вместе запускают распределенное приложение. Процессы на каждом подчиненном компьютере должны иметь графический интерфейс и доступ к сети (я думаю, что тогда он будет называться интерактивным процессом). Для простоты использования было бы неплохо, если бы мастер-машина могла запускать/останавливать процессы на этих подчиненных машинах.Запуск удаленных процессов в сети Windows

Моя первая идея заключалась в том, чтобы использовать WMI и класс Win32_Process для запуска удаленного процесса, но при дальнейшем исследовании было показано, что процессы, запущенные таким образом, не являются интерактивными и изолированными и, следовательно, не могут иметь никакого графического интерфейса. В примечании говорится, что можно использовать Win32_ScheduledJob.Create для создания удаленного интерактивного процесса, но он работает под учетной записью LocalSystem, которую я бы хотел избежать (также я не мог даже запустить ее правильно).

Что было бы хорошим путем для решения этой проблемы? Возможно, возможно запустить вспомогательное приложение, которое, в свою очередь, запускает правильный процесс, но это кажется довольно грязным.

Редактировать: PsExec был действительно неуклюжим, когда я пробовал его и медленно, как черт (не знаю почему). Если посмотреть в PsExec, кажется, он устанавливает временную службу на удаленном компьютере для запуска приложения. Будет ли это единственным способом запуска интерактивного процесса с использованием правильной идентификации? Должен ли я включать вспомогательную службу в настройку для узлов? Но даже тогда, как бы я тогда общался с ним?

ответ

6

PsExec является частью пакета Sysinternals, который может сделать что

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

Если ваши серверы работают под управлением Windows 2008 вы также можете использовать

Terminal Services Remote App

+0

Когда я попробовал PsExec, это было довольно медленно (не знаю почему) и не работало корректно. Приложения GUI будут запущены под правой учетной записью, которые можно увидеть на панели задач, но фактический графический интерфейс никогда не обновлялся, и был показан только мертвый «блок». – gix

1

Вы можете использовать «в ".

Открыть командную строку и тип

at /? 

В терминале. Единственным недостатком является то, что время на удаленной системе должно быть в пределах разумной дельта вашего. Это тоже не мгновенно. Вы должны подождать несколько секунд, чтобы убедиться, что удаленный планировщик не пропустил событие полностью.

Существует эквивалентный WMI к этому, и имеет те же основные предостережений как в:

ПЕРЕЧИСЛЯТЬ 3: Код для создания интерактивного процесса на Windows Server 2003, Windows XP и Win2K SP3 Машины

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 

Я думаю, что большинство других способов сделать это (без установки собственного сервиса) были отключены различными пакетами обновлений из-за уязвимостей.

1

Следующие два сообщения используют .NET для выполнения удаленных процессов.

  1. Использование WMI

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

  2. CodeProject Пример

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

Примеры выполнения с помощью пользовательских учетных данных & удаленный исполняемый является Win Fo rm приложение. Надеюсь, это поможет.

1

Если группа enire находится под вашим контролем, может быть возможно реализовать эти удаленные процессы как службы Windows. Услуга может быть интерактивной (хотя и не по умолчанию), и ее можно дистанционно контролировать с помощью стандартного диспетчера управления службами, работающего на каждом ПК с ОС Windows.

+0

Возможно, услуга может быть интерактивной? У меня есть служба, с которой я общаюсь с помощью hangfire, на виртуальной машине под управлением Windows Server 2012, и я не могу заставить эту службу запускаться в интерактивном режиме ... – EluciusFTW

+0

@EluciusFTW: вы не можете заставить случайные службы запускаться интерактивно, но здесь, на StackOverflow I Предполагаю, что я обращаюсь к разработчику сервиса. – MSalters

+0

Я хочу получить свое самоназванное обслуживание (написанное на C# с использованием TopShelf) для интерактивного запуска. Есть идеи? См. Здесь: http://stackoverflow.com/questions/39721393/service-does-not-execute-command-on-windows-server-2012 – EluciusFTW

0

Комплект PSTools был разработан Sysinternals и был настолько велик, что компания была приобретена Microsoft спустя некоторое время. Использование этих инструментов - лучший способ выполнить вашу задачу.

Я вижу, что вы упомянули проблему с запуском приложений в интерактивном режиме. Могу ли я предложить использовать/i для запуска приложения в интерактивном режиме. PSTools предлагает все функции, которые вы ищете. Вам просто нужно поиграть с переключателями, чтобы получить желаемый результат.

Я никогда не испытывал медлительность, которую вы описываете в моих приложениях, которые используют PSTools.

1

Могу ли я спросить, почему для подчиненных процессов должен быть GUI? У меня есть аналогичная настройка, но мне нужен графический интерфейс только при первоначальной настройке.

В любом случае, вот что я сделал, но, к сожалению, он полагается на процесс, выполняемый как учетная запись LocalSystem, и я понимаю, что вы пытаетесь избежать, если вам действительно нужен GUI.

Чтобы предоставить вам немного фона, приложение, которое я должен был распространять, было Hudson, и это была более ранняя версия, где способ распространения вами - это запустить приложение Java WebStart и, следовательно, потребность в графическом интерфейсе (например, по крайней мере, во время настройки, чтобы помочь устранить неполадки).

Что я сделал, было создано подчиненное приложение как службы на подчиненных машинах с помощью sc.exe (что является PITA, чтобы получить право, к счастью, вы это делаете только один раз). Что-то вдоль линий:

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

Примечание пространства после того, как параметры (binPath = и т.д.), те, которые необходимы. Также обратите внимание, что мне было проще сбросить «type = interactive» и вручную изменить его в консоли управления.

Затем на хозяина, а также с помощью sc.exe, я запустить службу удаленно:

sc.exe \\slavemachine start SlaveService 

И проверить, что программа работает на подчиненных машинах.

Теперь в моем случае мне не нужен GUI, кроме как для первоначального устранения неполадок. Как только у меня все работает нормально, я просто настроил службу на запуск как учетную запись службы, но больше не в интерактивном режиме.

Надеюсь, вы сочтете это полезным.

+0

Очень поздний ответ * утка *. Процессам нужен графический интерфейс, поскольку это была визуализация на нескольких машинах и дисплеях (powerwall). – gix

1

Есть пара компонентов, которые вам понадобятся, чтобы это произошло.

Во-первых, вам понадобится способ связи с удаленной машиной.

Во-вторых, вам потребуется что-то на прослушивании удаленной машины, которое может начать ваше приложение.

Другие предложения, прежде всего, используют что-то встроенное для одного или обоих этих компонентов, что прекрасно, если ограничения любого из данных решений являются подходящими.

PsExec выглядит как наиболее перспективное, готовое решение. В противном случае вы можете сворачивать собственное приложение, чтобы прослушивать простые сообщения через TCP/named pipe/whatever и просто создавать соответствующие подпроцессы. Единственное предостережение в этом заключается в том, что вам нужно быть очень осторожным в отношении безопасности, особенно если какая-либо из машин публично раскрыта.

0

MPICH2 часто используется в высокопроизводительных вычислительных кластерах и должен быть способен делать то, что вы хотите. Даже если вы не используете его для передачи сообщений между машинами, вы можете использовать его программу запуска, чтобы запустить все процессы с главной машины. Его можно настроить для аутентификации как конкретного пользователя Windows на машинах.