Книга: Windows Script Host для Windows 2000/XP

Запуск сценариев на удаленных машинах. Контроль за ходом выполнения таких сценариев

Запуск сценариев на удаленных машинах. Контроль за ходом выполнения таких сценариев

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

Такие WSH-сценарии называются удаленными сценариями (remote scripts). При этом файл со сценарием может находиться либо на локальной машине, либо на общедоступном сетевом ресурсе. На жесткий диск удаленной машины файл сценария копироваться не будет — вместо этого текст сценария по коммуникационному протоколу DCOM — Distributed СОМ (распределенный СОМ) передается непосредственно в память процесса, запускаемого на этой машине.

Естественно, такой механизм запуска сценариев является весьма мощным средством удаленного администрирования, однако он также может быть использован для быстрого и практически незаметного распространения по сети вирусов. Поэтому при использовании удаленных сценариев WSH предусмотрены довольно строгие меры безопасности.

Во-первых, и на локальной и на удаленной машинах должны быть установлены операционные системы Windows NT (SP 3)/Windows 2000/Windows ХР (системы Windows 95/98/ME не поддерживаются).

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

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

HKLMSoftwareMicrosoftWindows Script HostSettingsRemote (А)

(если этот параметр не существует, его нужно создать). Если значением этого параметра является 0, то это означает, что выполнение удаленных сценариев на машине запрещено.

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

HKCUSoftwareMicrosoftWindows Script HostSettingsRemote (Б)

и также записать в него 1. Если значением этого параметра является 0, то это означает, что выполнение удаленных сценариев для текущего пользователя запрещено.

Также при настройке режима выполнения удаленных сценариев нужно проверить значение параметра

HKLMSoftwareMicrosoftWindows Script HostSettingsIgnoreUserSettings (В)

Если значением этого параметра является 1, то параметр (Б) игнорируется и проверяется только значение параметра (А). Если же значением параметра (В) является 0, то WSH сначала проверяет параметр (Б) и только в случае его отсутствия принимается во внимание значение параметра (А).

Если удаленные сценарии нужно выполнять на машине с операционной системой Windows ХР, то на этой машине нужно перерегистрировать сервер wscript.exe с помощью следующей команды:

wscript.exe -regserver

Удаленные сценарии всегда запускаются с помощью сервера wscript.exe, причем в этих сценариях не поддерживается вывод на экран удаленного компьютера никаких элементов пользовательского интерфейса (не выводятся даже диалоговые окна с сообщениями о возникающих в ходе выполнения ошибках). Другими словами, в удаленных сценариях по умолчанию нельзя использовать методы WScript.Echo или WshShell.Popup (это может привести к непредсказуемым результатам).

Для примера рассмотрим сценарий RemoteShortcut.js (листинг 2.52), который создает ярлык в специальной папке AllUserDesktop (рабочий стол для всех пользователей). Предположим, что этот сценарий находится в корневом каталоге диска D:, а запустить сценарий необходимо на компьютере Stand.

Листинг 2.52. Сценарий для запуска на удаленной машине (JScript)

/*****************************************************************/
/* Имя: RemoteShortcut.js                                        */
/* Описание: Создание ярлыка на рабочем столе                    */
/*****************************************************************/
var WshShell,MyShortcut,PathTarg,PathShortcut;
//Создаем объект WshShell
WshShell = WScript.CreateObject("WScript.Shell");
//Определяем путь к папке "AllUsersDesktop" (рабочий стол
//всех пользователей)
PathShortcut = WshShell.SpecialFolders("AllUsersDesktop");
//Создаем объект-ярлык
MyShortcut = WshShell.CreateShortcut(PathShortcut+ "From Remote WSH.lnk");
//Устанавливаем путь к файлу
PathTarg=WshShell.ExpandEnvironmentStrings("%windir%notepad.exe");
MyShortcut.TargetPath = PathTarg;
MyShortcut.Save();  //Сохраняем ярлык
/*************  Конец *********************************************/

Для запуска сценария RemoteShortcut.js на удаленном компьютере Stand нужно создать другой сценарий RunRemoteScript.js (листинг 2.53). Здесь вначале создается объект WshController:

Controller = WScript.CreateObject("WshController");

Затем мы получаем ссылку на экземпляр объекта WshRemote на машине Stand, соответствующий сценарию с текстом, взятым из файла D:RemoteScript.js:

RemScript = Controller.CreateScript("D:RemoteScript.js", "stand");

Запускается удаленный сценарий с помощью метода Execute:

RemScript.Execute();

После этого нужно дождаться окончания работы сценария на удаленной машине, что делается путем контроля в цикле while свойства Status объекта WshRemote (значение свойства status, равное 2, говорит о том, что выполнение удаленного сценария завершено):

while (RemScript.Status != 2)
 //Цикл выполняется до завершения удаленного сценария
 WScript.Sleep(100); //Приостанавливаем сценарий на 0,1 сек

Метод Sleep объекта WScript вызывается в цикле для того, чтобы освободить процессор во время ожидания завершения удаленного сценария (листинг 2.53).

Листинг 2.53. Запуск удаленного сценария (JScript)

/********************************************************************/
/* Имя: RunRemoteScript.js                                          */
/* Язык: JScript                                                    */
/* Описание: Запуск удаленного сценария                             */
/********************************************************************/
var Controller, RemScript;  //Объявляем переменные
//Создаем объект WshController
Controller = WScript.CreateObject("WshController");
//Создаем сценарий на удаленной машине (объект WshRemote)
RemScript = Controller.CreateScript("D:RemoteScript.js", "stand");
RemScript.Execute();  //Запускаем удаленный сценарий
WScript.Echo("Удаленный сценарий запущен");
while (RemScript.Status != 2)
 //Цикл выполняется до завершения удаленного сценария
 WScript.Sleep(100);  //Приостанавливаем сценарий на 0,1 сек
WScript.Echo("Выполнение удаленного сценария завершено");
/*************  Конец *********************************************/

В листинге 2.54 приведен аналог сценария RunRemoteScript.js на языке VBScript.

Листинг 2.54. Запуск удаленного сценария (VBScript)

'********************************************************************
' Имя: RunRemoteScript.vbs
' Язык: VBScript
' Описание: Запуск удаленного сценария
'********************************************************************
Option Explicit
Dim Controller, RemScript  ' Объявляем переменные
' Создаем объект WshController
Set Controller = WScript.CreateObject("WshController")
' Создаем сценарий на удаленной машине (объект WshRemote)
Set RemScript = Controller.CreateScript("D:RemoteScript.js", "stand")
RemScript.Execute  ' Запускаем удаленный сценарий
WScript.Echo "Удаленный сценарий запущен"
While RemScript.Status <> 2
 ' Цикл выполняется до завершения удаленного сценария
 WScript.Sleep 100  ' Приостанавливаем сценарий на 0,1 сек
Wend
WScript.Echo "Выполнение удаленного сценария завершено"
'*************  Конец *********************************************

Контролировать ход выполнения удаленных сценариев можно не только путем анализа свойства Status, но и с помощью обработки событий Start (запуск сценария), Error (ошибка при выполнении сценария) и End (завершение работы сценария) объекта WshRemote; соответствующие примеры сценариев на языках JScript и VBScript приведены в листингах 2.55 и 2.56.

Напомним, что для обработки событий объекта нужно в сценарии сначала создать экземпляр этого объекта, а затем соединиться с ним при помощи метода ConnectObject, указав нужный префикс для функций-обработчиков:

Controller = WScript.CreateObject("WshController");
RemScript = Controller.CreateScript("D:RemoteScript.js ", "stand");
WScript.ConnectObject(RemScript, "RemoteScript_");

Затем в тексте сценария описываются функции RemoteScript_Start, RemoteScript_Error и RemoteScript_End, управление в которые будет передаваться при наступлении соответствующих событий.

Листинг 2.55. Обработка событий объекта WshRemote (JScript)

/**********************************************************************/
/* Имя: RemoteEvents.js                                               */
/* Язык: JScript                                                      */
/* Описание: Обработка событий, возникающих при выполнении удаленного */
/*           сценария                                                 */
/**********************************************************************/
var Controller,RemScript,IsQuit;  //Объявляем переменные
//Создаем объект WshController
Controller = WScript.CreateObject("WshController");
//Создаем сценарий на удаленной машине (объект WshRemote)
RemScript = Controller.CreateScript("D:RemoteScript.js ", "stand");
//Устанавливаем соединение с объектом WshRemote
WScript.ConnectObject(RemScript, "RemoteScript_");
RemScript.Execute();  //Запускаем удаленный сценарий
IsQuit = false;
while (!IsQuit) WScript.Sleep(100);  //Приостанавливаем сценарий на 0,1 сек
WScript.Quit();  //Выходим из сценария
/***************  Функции-обработчики событий  ***********************/
function RemoteScript_End() { //Событие End
 WScript.Echo("Выполнение удаленного сценария завершено");
 IsQuit = true;
}
function RemoteScript_Error() { //Событие Error
 //Выводим на экран описание возникшей ошибки
 WScript.Echo("Ошибка при выполнении удаленного сценария: " +
  RemScript.Error.Description);
 IsQuit = true;
}
function RemoteScript_Start() { //Событие Start
 WScript.Echo("Удаленный сценарий запущен");
}
/*************  Конец *********************************************/

Листинг 2.56. Обработка событий объекта WshRemote (VBScript)

'********************************************************************
' Имя: RemoteEvents.vbs
' Язык: VBScript
' Описание: Обработка событий, возникающих при выполнении удаленного
'           сценария
'********************************************************************
Option Explicit
Dim Controller,RemScript,IsQuit  ' Объявляем переменные
' Создаем объект WshController
Set Controller = CreateObject("WshController")
' Создаем сценарий на удаленной машине (объект WshRemote)
Set RemScript = Controller.CreateScript("D:RemoteScript.js ", "stand")
' Устанавливаем соединение с объектом WshRemote
WScript.ConnectObject RemScript, "RemoteScript_"
RemScript.Execute  ' Запускаем удаленный сценарий
IsQuit = False
While Not IsQuit
 WScript.Sleep 100  ' Приостанавливаем сценарий на 0,1 сек
Wend
WScript.Quit ' Выходим из сценария
'***************  Функции-обработчики событий  ***********************
Function RemoteScript_End()  ' Событие End
 WScript.Echo "Выполнение удаленного сценария завершено"
 IsQuit = True
End Function
Function RemoteScript_Error()  ' Событие Error
 ' Выводим на экран описание возникшей ошибки
 WScript.Echo "Ошибка при выполнении удаленного сценария: " & _
  RemScript.Error.Description
 IsQuit = True
End Function
Function RemoteScript_Start()  ' Событие Start
 WScript.Echo "Удаленный сценарий запущен"
End Function
'*************  Конец *********************************************
 

Замечание

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

Оглавление книги


Генерация: 0.037. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз