Запуск удаленных процессов в сети Windows - PullRequest
7 голосов
/ 03 апреля 2009

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

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

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

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

Ответы [ 8 ]

6 голосов
/ 03 апреля 2009

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

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

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

Удаленное приложение служб терминалов

1 голос
/ 01 июля 2009

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

Для начала вам понадобится метод связи с удаленным компьютером.

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

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

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

1 голос
/ 01 июля 2009

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

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

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

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

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

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

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

sc.exe \\slavemachine start SlaveService

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

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

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

1 голос
/ 29 июня 2009

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

1 голос
/ 27 июня 2009

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

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

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

  2. Пример проекта кода

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

Примеры выполняются с пользовательскими учетными данными, а удаленный исполняемый файл - это приложение Win Form. Надеюсь, это поможет.

1 голос
/ 26 июня 2009

Вы можете использовать команду "at".

Откройте командную строку и введите

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

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

0 голосов
/ 11 апреля 2012

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

0 голосов
/ 30 июня 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...