Как я могу удаленно выполнить скрипт в Windows?

Я хотел бы, чтобы сервер Windows 2003 запускал сценарий для запуска другого сценария на отдельном компьютере с Windows Server 2008.

Мне сказали, что Powershell может это сделать, и это нормально, но мне нужны более конкретные подробности.

У кого-нибудь есть советы по этому поводу?

Спасибо!


person Frew Schmidt    schedule 14.05.2009    source источник
comment
Этот вопрос, вероятно, лучше подходит для serverfault.com. Я отметил, чтобы закрыть по этой причине; stackoverflow теперь поддерживает перемещение вопросов между сайтами.   -  person Greg Hewgill    schedule 14.05.2009


Ответы (5)


psexec от SysInternals

person benPearce    schedule 14.05.2009
comment
Это кажется лучшим ответом. Завтра на работе попробую. - person Frew Schmidt; 14.05.2009

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

Команда AT планирует запуск команд и программ на компьютере в указанное время и дату. Для использования AT-команды должна быть запущена служба расписания.

AT [\\computername] [ [id] [/DELETE] | /DELETE [/YES]]
AT [\\computername] time [/INTERACTIVE]
    [ /EVERY:date[,...] | /NEXT:date[,...]] "command"

\\computername     Specifies a remote computer. Commands are scheduled on the
                   local computer if this parameter is omitted.
id                 Is an identification number assigned to a scheduled
                   command.
/delete            Cancels a scheduled command. If id is omitted, all the
                   scheduled commands on the computer are canceled.
/yes               Used with cancel all jobs command when no further
                   confirmation is desired.
time               Specifies the time when command is to run.
/interactive       Allows the job to interact with the desktop of the user
                   who is logged on at the time the job runs.
/every:date[,...]  Runs the command on each specified day(s) of the week or
                   month. If date is omitted, the current day of the month
                   is assumed.
/next:date[,...]   Runs the specified command on the next occurrence of the
                   day (for example, next Thursday).  If date is omitted, the
                   current day of the month is assumed.
"command"          Is the Windows NT command, or batch program to be run.
person cdonner    schedule 14.05.2009

самый простой способ использования будет состоять из двух шагов

а. установка cygwin на удаленный компьютер

б. запустите ssh hudson@mcs '/cygdrive/c/path_to_script.bat'

person pkm    schedule 25.11.2013

Говоря о PsExec, я бы настоятельно предложил вместо этого использовать Cygwin/OpenSSH.

SSH имеет множество преимуществ (по сравнению с такими инструментами, как PsExec, или даже с сервисами, созданными на заказ).
Например, попробуйте использовать с PsExec и реализовать то, что делают эти командные строки bash / ssh:

ssh user@remotehost "find . -name something" 2> all.errors.txt
ssh user@remotehost "grep -r something ."
if [ "$?" == "0" ]
then
    echo "FOUND"
else
    echo "NOT FOUND"
fi

Удачи!

  • SSH передает (!) состояние удаленного stdout / stderr / выхода в локальную оболочку для проверки
    (убойная функция и общее требование интеграции удаленного выполнения в логику локальных скриптов)

  • Cygwin/OpenSSH предоставляет стандартную среду оболочки POSIX
    (экономичные затраты времени, основные инструменты, кросс-платформенная готовность, совместимые привычки и т. д.)

  • Вы по-прежнему/всегда можете запускать все родные приложения Windows
    (включая автоматическое выполнение *.bat файлов cmd процессором)

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


Совет

Первоначально у меня были проблемы с одним требованием:
фоновая служба sshd должна была выполнять приложения в графическом сеансе пользователя
(чтобы окно приложения появлялось в среде рабочего стола).

приемлемое решение для меня заключалось в запуске sshd службы напрямую в сеансе GUI пользователя
(запускается автоматически при входе пользователя в систему, перейдите по ссылке, чтобы увидеть изменения в файле конфигурации):

/usr/sbin/sshd -f /home/user/sshd_config
person uvsmtid    schedule 23.05.2013
comment
Я на самом деле использую SSH, fwiw. Проблема в том, что SSH не может запустить программу с графическим интерфейсом (хотя указанная программа с графическим интерфейсом не имеет графического интерфейса...) - person Frew Schmidt; 24.05.2013
comment
@Frew, ссылка из подсказки специально предназначена для удаленного запуска приложений с графическим интерфейсом в Windows. И, на мой взгляд, нет более простого и гармоничного решения этой проблемы (по крайней мере, в том контексте, в котором мне приходилось с ней сталкиваться). Если рассматриваемый хост Windows существует для роли чистого сервера, вам все равно может потребоваться автоматический вход в систему этого пользователя после каждой перезагрузки (чтобы сеанс рабочего стола и sshd оставались активными все время). - person uvsmtid; 24.05.2013
comment
Я могу изучить это снова, но у меня были довольно серьезные проблемы с проектом, для которого это было (автоматическое тестирование установщика NSIS), до такой степени, что мне пришлось полностью отказаться. - person Frew Schmidt; 24.05.2013
comment
@Frew, на самом деле, мне также нужно было удаленное выполнение графического интерфейса для автоматического тестирования (на стороне клиента). - person uvsmtid; 24.05.2013
comment
Ну а когда перейду к созданию установщика (а не только апдейтера) этой штуки пересмотрю :) - person Frew Schmidt; 24.05.2013

Принятое решение с http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/Q_22959948.html:

То, что я предоставляю, было сценарием, который принимает параметры... В этом случае он принимает 4. 1) Сервер: если вы передадите -server, это будет делать только один сервер 2) Список: вы можете предоставить файл со списком серверов. 3) Служба: имя службы, которую вы хотите изменить. 4) Подробно: здесь не используется.

У меня были некоторые ошибки, которые я изменил в следующем коде. Для использования вырежьте/вставьте код в файл с именем Set-RemoteService.ps1. Убедитесь, что ваша политика выполнения настроена на запуск скриптов... по умолчанию это не так. Это делается с помощью командлета set-executionpolicy. PS> Set-Executionpolicy "RemoteSigned" для запуска скрипта, который вы делаете PS> C:\PathToScript\Set-RemoteService.ps1 -list c:\ServerList.txt -service "DHCP"

######################### Param($server,$list,$service,[switch]$verbose)

if($Verbose){$VerbosePreference = "Продолжить"} if($list) { foreach($srv in (get-content $list)) { $query = "Выбрать * из Win32_Service, где Name='$service'" $ myService = get-WmiObject -query $query -computer $srv $myService.ChangeStartMode("Автоматически") $myService.Start() } } if($server) { $query = "Выбрать * из Win32_Service, где Name='$service '" $myService = get-WmiObject -query $query -computer $server $myService.ChangeStartMode("Автоматически") $myService.Start() }

person Jonathan Parker    schedule 14.05.2009
comment
Этот сценарий запускает существующие службы на удаленном компьютере, но не запускает произвольные сценарии. - person Glen Little; 27.06.2012