Использование утилиты jt.exe для планирования заданий на удаленных системах
Запуск программ на удаленных компьютерах представляет собой типичную задачу администрирования. Подобные операции могут выполняться, например, при установке обновлений программного обеспечения. В версиях операционных систем Microsoft Windows 2000 и более поздних имеется служба планировщика задач Task Scheduler, предоставляющая администратору гибкие возможности формирования списка программ, запускаемых по расписанию на локальном или удаленном компьютере. В отличие от старой версии планировщика в Windows NT, где работа с расписанием запускаемых программ выполнялась путем запуска из командной строки утилиты AT.exe, здесь процедуру планирования задач можно выполнять через удобный графический интерфейс пользователя.
Тем не менее в ряде случаев приходится работать со службой планировщика задач из командной строки. В целях обеспечения обратной совместимости в новых версиях операционных систем утилита AT.exe сохранена, но необходимо учитывать, что ей присущи некоторые ограничения. Это связано с тем, что по умолчанию задания, помещенные в расписание с помощью команды AT.exe, будут выполняться от имени системной учетной записи, которая в целях безопасности лишена прав доступа по сети. Данное ограничение может привести к неполадкам при запуске по расписанию программ, находящихся на другом компьютере.
В подобных случаях может помочь служба Task Scheduler, но нужно иметь в виду, что в стандартной конфигурации системы Windows 2000 отсутствуют программные средства для запуска из командной строки программ, помещенных в расписание, в контексте сетевой учетной записи. Тем не менее у Microsoft имеется программный инструмент для управления службой Windows Task Scheduler из командной строки. Речь идет об утилите jt.exe, входящей в состав комплекта Microsoft Windows 2000 Resource Kit. Данную утилиту еще можно загрузить по адресу: ftp://ftp.microsoft.com/reskit/win2000/jt.zip. Здесь следует отметить, что некоторые пользователи сообщают о возникновении проблем при попытках загрузить данные с FTP-сайта Microsoft. Программа JT.exe также может применяться на системах Windows XP и более поздних версиях. На языке VBScript мною был разработан сценарий под названием JTRun.vbs, в котором используется функциональность JT.exe для удобного и безопасного запуска программ на удаленном компьютере. Файл данного сценария можно найти на Web-сайте нашего журнала по адресу http://www.windowsitpro.ru в разделе Download.
Хотя в операционных системах Windows XP и более поздних имеется встроенное средство, обеспечивающее интерфейс командной строки для службы Task Scheduler, а именно утилита Schtasks, данный инструмент не обладает функцией run-now (немедленный запуск), которая предусмотрена в JT.exe. То есть если с помощью JT.exe команда может быть запущена на исполнение сразу же (а точнее, на следующей минуте), то для работы Schtasks требуется явно указать время запуска. Для запуска программ на удаленных системах существуют и другие утилиты, в частности PsExec. Более подробную информацию об утилите PsExec можно найти в статье PsExec, опубликованной в № 6 нашего журнала за 2004 год. Но применение данной утилиты имеет ограничения по безопасности: если для работы программы требуется указать другую учетную запись, то PsExec будет передавать пароль этой записи по сети в открытом виде. Служба Task Scheduler (а следовательно, и утилита Jt.exe, являющаяся, по сути, интерфейсом командной строки для Task Scheduler) лишена подобного недостатка.
Необходимо также учитывать, что если служба Task Scheduler используется для запуска по расписанию какой-либо программы на удаленном компьютере и если регистрация на удаленной системе осуществлялась не под той учетной записью, от имени которой должна запускаться данная программа, то при запуске программы никакой информации на экране удаленного компьютера отображаться не будет. Поэтому подобным образом следует запускать по расписанию только те программы, которые будут нормально функционировать без вмешательства пользователя.
На компьютере, предназначенном для запуска сценария JTRun.vbs, должен быть установлен VBScript версии 5.6. Для этого на системах с Windows 2000 нужно либо обновить компонент обработки сценариев, либо установить Microsoft Internet Explorer (IE) 6.0. Для Windows XP и более поздних версий систем никаких обновлений не требуется. Я выполнил небольшое тестирование утилиты Jt.exe и описываемого сценария на системе с Windows NT 4.0. Оказалось, что обе программы прекрасно работают и на этой системе, при условии что на ней установлены служба Task Scheduler (доступная через компонент IE Offline Browsing Pack) и компонент VBScript версии 5.6.
Параметры командной строки утилиты Jt
Прежде чем подробно рассматривать сценарий JTRun.vbs, давайте разберем синтаксис командной строки утилиты Jt. Для выполнения запуска команды по расписанию на удаленном компьютере в сценарии используются пять аргументов командной строки утилиты Jt: /sm, /saj, /sc, /ctj, и /sj. Чтобы получить справку по любому из этих аргументов, нужно при запуске программы Jt указать ключ /?. Например, если требуется получить справочную информацию по ключу /sm, следует запустить показанную ниже команду:
jt /? /sm
Ключ /sm задает имя компьютера. При задании имени системы для утилиты Jt необходимо перед этим именем ставить двойной обратный слэш (). При запуске сценария JTRun.vbs этот символ в имени системы можно не указывать, поскольку сценарий добавит его сам. Необходимо также помнить о том, что при перечислении параметров командной строки запуска Jt ключ /sm должен стоять на первом месте, поскольку для работы данной утилиты наличие на первом месте имени компьютера является обязательным условием. Остальные ключи могут указываться в произвольном порядке.
С помощью ключа /saj определяется имя файла задания (с расширением .job), который будет создан. Этот файл будет создан в том каталоге, где хранятся назначенные задания компьютера (\%SystemRoot%Tasks). Сценарий генерирует имя задания, основываясь на имени программы и значениях текущих даты и времени. В ключе /sc могут быть заданы параметры той учетной записи (имя пользователя и пароль), от имени которой будет запускаться данная программа. Как правило, эта учетная запись должна входить в локальную группу Administrators на удаленном компьютере.
Ключ /ctj позволяет установить параметры расписания для выполняемого задания. В данном ключе используется несколько пар величин, имеющих вид параметр=значение. В рассматриваемом сценарии JTRun.vbs применяются следующие пары: StartTime=now, Type=once и Disabled=0. Параметр StartTime=now говорит о том, что помещенное в расписание задание будет выполняться немедленно, а точнее, на следующей минуте после его появления в расписании. Иными словами, если команда стоит в расписании, скажем, в 12:33:45, то она будет запущена в 12:34:00. Параметр Type=once указывает, что программа должна запуститься только один раз. Это может показаться странным, но наличие параметра Disabled=0 является обязательным, поскольку, если его не указать, задание будет сформировано и появится в списке активных заданий (enabled), но на выполнение запущено не будет.
Ключ /sj позволяет задать саму запускаемую программу, ее параметры командной строки и каталог запуска (т. е. каталог, из которого задание будет запускаться на выполнение). Как и в случае /ctj, ключ /sj также использует пары вида параметр/значение. В сценарии JTRun.vbs в ключе /sj применяются следующие величины: ApplicationName=путь и имя файла запускаемой программы, Parameters= аргументы командной строки программы, WorkingDirectory=путь к каталогу запуска и DeleteWhenDone=1. Свойство ApplicationName является обязательным и задает путь и имя файла, относящиеся к удаленному (а не локальному) компьютеру. Свойство Parameters не является обязательным и определяет аргументы командной строки запускаемой программы. Если в содержимом данного свойства присутствуют пробелы, то оно должно заключаться в двойные («») кавычки. Также следует учитывать, что утилите Jt присуще ограничение, которое заключается в том, что параметры, описанные в свойствах ApplicationName и Parameters, не должны содержать кавычек. Необязательный параметр WorkingDirectory задает для программы каталог запуска. Еще один необязательный параметр, DeleteWhenDone, нужен для того, чтобы указать, должна служба Task Scheduler удалить задание после его успешного запуска (1) или сохранить его в каталоге Tasks (0).
Ниже показан пример корректного вызова утилиты Jt из командной строки:
jt /sm pc1 /saj «update 1»
/sc mydomadministrator password
/ctj StartTime=now Type=once Disabled=0
/sj ApplicationName=»srv1 updatesupdate 1.exe» DeleteWhenDone=1
В статье примеры команд для удобства приводятся в виде нескольких строк, но в действительности все они должны вводиться одной командной строкой. В рассматриваемом примере выполняется подключение к удаленному компьютеру с именем pc1 и создается задание с именем update 1. Запуск этого задания осуществляется от имени учетной записи mydomadministrator и соответствующего пароля. Я рекомендую использовать учетную запись, которая является членом локальной группы Administrators как на удаленном, так и на локальном компьютере. Задание будет запущено на следующей относительно текущего времени минуте. Будет запущена программа «srv1updatesupdate 1.exe» (кавычки здесь необходимы, поскольку в названии имеется пробел), а в случае успешного запуска задания по его завершении оно будет удалено.
Если пользователь компьютера, на котором запускается задание, зарегистрировался с учетной записью, отличной от той, под которой это задание запускается, то для такого пользователя задание будет выполняться в скрытом режиме и никакой информации о выполняемом задании на экран выводиться не будет. Поэтому еще раз подчеркну: следует предварительно убедиться, что данное задание может выполняться без вмешательства пользователя, поскольку в противном случае оно будет находиться на компьютере в незавершенном состоянии до тех пор, пока администратор принудительно не завершит его.
Следует также иметь в виду, что при запуске утилиты Jt можно столкнуться, например, с такой проблемой, как получение сообщения Access denied после выполнения команды. Для того чтобы этого избежать, нужно удостовериться, что заданная в команде учетная запись имеет право Access this computer from the network на удаленном компьютере. Учтите также, что если на данном компьютере установлена операционная система Windows XP Service Pack 2 (SP2), то следует отключить имеющийся в системе межсетевой экран.
Использование JTRun.vbs
Как мы могли убедиться, утилита Jt обладает значительной гибкостью, но имеет при этом довольно сложный синтаксис командной строки. Назначение разработанного сценария JTRun.vbs заключается в том, чтобы скрыть от пользователя сложность командной строки утилиты Jt и обеспечить возможность быстрого, удобного и безопасного запуска программ на удаленных компьютерах. Для запуска JTRun.vbs должна применяться Cscript.exe. Чтобы настроить Cscript.exe в качестве использующейся по умолчанию службы обработки сценариев для текущего пользователя, запустите команду:
cscript //h:cscript //nologo //s
Для запуска сценария JTRun.vbs используется следующий синтаксис командной строки:
JTRun.vbs /computer: /account: /password: /program: [/parameters:] [/startin:] [/trace]
При запуске данного сценария из командной строки должны быть заданы четыре обязательных параметра: имя компьютера, имя учетной записи, ее пароль и название запускаемой программы. Для запускаемой программы можно дополнительно задать ее параметры командной строки (с помощью ключа /parameters) и каталог запуска (с помощью ключа /startin). При использовании ключа /trace будет полностью отображаться командная строка Jt, ее выходные данные и код завершения (exit code). Если в каком-либо из ключей программы необходимо ставить пробелы, следует вводить для этого двойные кавычки. Использование символов кавычек внутри описаний ключей не допускается.
Чтобы увидеть, насколько проще задействовать сценарий JTRun.vbs, чем саму утилиту Jt, давайте рассмотрим приведенный ниже пример команды, которая реализует ту же функциональность, что и показанный ранее пример запуска Jt из командной строки:
JTRun.vbs /computer:pc1
/account:mydomadministrator
/password:password
/program:»srv1updates
update 1.exe»
[pc1]: Scheduled job ?update 1 [20041011_110415]? |
Экран 1. Выходные данные примера выполнения команды запуска JTRun.vbs |
Если программа Cscript.exe не является используемой по умолчанию службой обработки сценариев, тогда имя cscript должно указываться в строке запуска перед вызовом JTRun.vbs. С помощью этой команды запускается программа «srv1updatesupdate 1.exe». Запуск программы будет осуществлен на следующей по отношению к текущему времени минуте; для запуска программы используется учетная запись mydomadministrator. Обратите внимание, что в имени программы встречается пробел, поэтому полный путь и имя программы заключены в кавычки. Выходные данные, полученные в результате запуска подобной команды, приведены на экране 1. Если в рассматриваемую команду добавить ключ /trace, мы увидим выходные данные, подобные тем, которые показаны на экране 2. Просматривая свойства сформированного задания (заглянув в папку Scheduled Tasks), увидим диалоговое окно, в котором будут отображены аргументы, установленные в команде запуска JTRun.vbs.
[TRACE] Command line: ?jt /sm «pc1» /saj «update 1 [20041011_111136]» /sc «mydom administrator» «password» /ctj StartTime=now Type=once Disabled=0 /sj ApplicationName=»srv1 updatesupdate 1.exe» Parameters=»» DeleteWhenDone=1? [TRACE] Setting target computer to ?pc1? [TRACE] Adding job ?update 1 [20041011_111136]? [TRACE] Setting account information [TRACE] Created trigger 0 [TRACE] Setting job?s properties [TRACE] Exit code: 0 |
Экран 2. Выходные данные примера выполнения команды запуска JTRun.vbs с использованием ключа /trace |
Внутреннее устройство сценария JTRun.vbs
Прежде чем использовать JTRun.vbs в рабочей среде, стоит познакомиться с тем, как работает данный сценарий. В начале стоит предложение Option Explicit, требующее объявления всех используемых в программе переменных (все сценарии, предназначенные для промышленного применения, должны обязательно содержать это предложение). Затем с помощью объявления Const в соответствующей константе определяется имя сценария. И,наконец, из сценария осуществляется вызов процедуры Main, приведенной в листинге 1 и содержащей основное тело сценария. В первую очередь процедура Main вызывает функцию ScriptHost, с помощью которой проверяется, запущен ли данный сценарий с помощью службы Cscript. Если это не так, то работа сценария JTRun.vbs аварийно завершается и выводится сообщение об ошибке. Использование службы обработки сценариев Cscript в качестве обработчика позволяет организовать перенаправление выходных данных сценария в файл, что может оказать неоценимую помощь в процессе его отладки.
Процедура Main отвечает за обработку аргументов командной строки сценария и корректное построение соответствующей строки вызова утилиты Jt, для чего используется набор Wscript.Arguments.Named. Впервые данный набор появился в исполняемой среде VBScript 5.6, в результате чего было реализовано простое и гибкое решение для обработки в сценариях аргументов командной строки. В рассматриваемом сценарии доступ к элементам набора Wscript.Arguments.Named осуществляется с помощью оператора With. В том случае если какой-либо из четырех параметров командной строки потерян или является пустым, сценарий вызывает процедуру Usage, которая выводит короткое сообщение о правильном использовании параметров запуска сценария, а затем сценарий завершает работу. На следующем шаге JTRun.vbs обрабатывает имя компьютера, используя для этого вызов функции FixComputerName, которая добавляет перед именем компьютера символ двойного обратного слэша «» в том случае, если данный символ в имени компьютера отсутствует. Затем вызовом функции GetProgramName осуществляется формирование задания. Данная функция возвращает только имя файла программы (в том случае, если был задан полный путь), для чего в ней используется метод GetBaseName объекта FileSystemObject. В сценарии вызывается также функция StrDateTime, которая возвращает в строковом виде текущие дату и время в формате ггммдд_ччммсс. Значение, получаемое в результате выполнения данной функции, присоединяется к имени формируемого задания. Подобный метод формирования имени обеспечивает высокую вероятность того, что имя формируемого задания будет уникальным даже в тех случаях, когда формируется несколько заданий подряд. В целях отладки в параметрах запуска данного сценария используется ключ /trace. Если данный параметр задан, переменной blnTrace, используемой в процедуре Main, присваивается значение True.
В метке A сценарий формирует командную строку для запуска утилиты Jt. Каждый аргумент данной командной строки заключается в двойные кавычки. В VBScript для использования двойных кавычек внутри строки их необходимо писать дважды: «». Должен заметить, что в процессе работы с утилитой Jt я столкнулся с одним ограничением, которое заключается в том, что параметр WorkingDirectory (рабочий каталог) ключа /sj данной утилиты не может иметь пустое значение. Поэтому, если при вызове JTRun.vbs применяется ключ /startin, в конец командной строки добавляется параметр WorkingDirectory, поскольку в противном случае он не будет задействован.
На данном этапе выполнения сценария все готово для запуска утилиты Jt, что реализуется путем вызова функции RunCommandLine с указанием двух аргументов: полной строки запуска программы Jt и значения переменной blnTrace. Исходный код функции RunCommandLine приведен в листинге 2. Возвращаемое данной функцией значение представляет собой код завершения работы утилиты jt.exe, который записывается в переменную lngExitCode в процедуре Main. Затем сценарий завершается с тем же кодом, что и запускаемая функцией RunCommandLine программа (т. е. jt.exe).
В функции RunCommandLine для запуска программы используется объект WshScriptExec (который появился в исполняемой среде VBScript 5.6). Функция создает объект WshScriptExec с помощью вызова метода Exec объекта WshShell и указания параметров командной строки (аргумент strCommand). Цикл Do While позволяет проверить, завершила ли выполнение утилита jt. Для этого в цикле организована проверка равенства нулю свойства Status; если это так, то выполнение сценария приостанавливается на время, равное 100ms, после чего выполняется повторная проверка. Таким образом, сценарий не завершит свою работу до тех пор, пока не завершится выполнение запущенной им программы.
Затем функция проверяет значение переданного ей параметра blnShowOutput. Если оно равно True (т. е. если в командной строке был задан ключ /trace), программа Jt осуществляет вывод стандартного выходного потока на экран. И наконец, функция возвращает код завершения работы утилиты Jt, который затем используется сценарием для завершения работы, как было показано выше.
Несколько предупреждений
Если сценарий JTRun.vbs используется для запуска программ на удаленных компьютерах, то нужно учитывать ряд важных особенностей этого сценария. Во-первых, все названия файлов и путей к каталогам должны относиться к удаленному, а не к локальному компьютеру. Если, например, формируется задание для запуска программы C:in unme.exe, то данный файл может существовать на локальном компьютере, но если его не будет по указанному пути на удаленной системе, задание не будет выполнено. С другой стороны, поддерживаемая утилитой Jt возможность запуска задания на следующей после его формирования минуте (StartTime=now) относится как раз к текущему компьютеру, но не к удаленному. Так что если на этих системах часы не синхронизированы, то запуск задания в ожидаемое время может не произойти.
Следует также отметить, что, поскольку при использовании сценария JTRun.vbs ввод пароля учетной записи производится обычным текстом в командной строке, то, само собой разумеется, что при использовании данного сценария должны приниматься соответствующие меры предосторожности. Это обстоятельство следует иметь в виду при использовании других сценариев запуска по расписанию каких-либо команд на нескольких компьютерах. Соответственно, если в данных сценариях используется вызов JTRun.vbs, то нужно понимать, что в этом случае будет использоваться пароль в виде простого текста, значит, следует проявлять особую осторожность при их использовании. Нужно учитывать и тот факт, что, если используется перенаправление выходных данных сценария и ключ /trace, то в файле выходных данных также будет присутствовать пароль в виде простого текста. И наконец, необходимо убедиться, что программы, предназначенные для запуска по расписанию, не должны требовать в процессе выполнения вмешательства пользователя. Это связано с тем, что запускаемая таким образом программа не имеет возможности интерактивного взаимодействия с рабочим столом удаленной системы, за исключением тех случаев, когда параметры учетной записи, от имени которой запускается по расписанию программа, совпадают с параметрами учетной записи пользователя, выполнившего локальную регистрацию на данной системе.
В целом планировщик заданий является очень мощной системной службой. Используя возможности утилиты jt.exe, сценарий JTRun.vbs позволяет расширить функциональность стандартной службы Task Scheduler и предоставляет пользователям удобный инструмент запуска программ на удаленных системах из командной строки.
Cистемный и сетевой администратор компании French Mortuary, Нью-Мехико. bill.stewart@frenchmortuary.com