Наша совместная команда Banwar.org

Связаться с нами

  • (097) ?601-88-87
    (067) ?493-44-27
    (096) ?830-00-01

Статьи

Запуск сценаріїв в якості служб

Бувають ситуації, коли потрібно, щоб сценарій запускався постійно, або необхідно отримати негайне повідомлення при виникненні помилки в ході його виконання. У цих особливих випадках для планування і управління завданнями я пробував використовувати спільно зі сценарієм утиліту Schtasks. Ця утиліта цілком справляється зі своїми завданнями, однак з'ясувалося, що для моїх цілей її можливості обмежені, оскільки виявилося досить складно отримати результати виконання сценаріїв системного адміністрування в необхідному форматі. До того ж використовувати сценарій для планування і управління завданнями можливо тільки в тих випадках, коли завдання створюється за допомогою класу Win32_ScheduledJob або утиліти At.

В результаті я вирішив спробувати запускати деякі зі створених мною сценаріїв в якості служб. Коли сценарій запускається в режимі служби, він може бути запущений постійно. Крім того, є кілька параметрів, що настроюються відновлення. У діалоговому вікні властивостей Properties служби є закладка відновлення Recovery, за допомогою якої можна налаштувати службу таким чином, щоб вона перезапускати сама себе в разі зупинки. Також можна налаштувати службу, щоб в разі її зупинки запускався деякий сценарій або програма, що видає сповіщення про зупинку служби. Ще є можливість перезавантаження комп'ютера, однак в промисловому застосуванні це навряд чи доцільно.

Зараз паралельно з планувальником я також використовую можливість запуску сценаріїв в режимі служб. Ці два підходи вдало доповнюють один одного. Для спрощення запуску сценарію в якості служби я розробив спеціальний додаток HTML Application (HTA). Я вибрав HTA, оскільки, в першу чергу, мені сподобалося використовувати в Windows додатки даного типу. Але більш важливо, що користувач точно знає, яку саме інформацію він повинен надати. У тих випадках, коли текстове поле заповнюється некоректно, користувач може ввести необхідні дані повторно. І ще одна перевага додатків HTA полягає в тому, що в них досить просто отримати довідкову інформацію.

Однак перш ніж застосовувати Install_service.hta, варто розібратися, як працює інтерфейс HTA, як за допомогою HTA сценарій запускається в режимі служби і як адаптувати його для того, щоб він міг бути запущений в режимі служби.

Інтерфейс HTA

Мені відомо, що інші співробітники нашої компанії теж хотіли б користуватися Install_Service.hta, тому я зробив його придатним для спільного використання. Як показано на малюнку 1, інтерфейс HTA містить кілька текстових полів, в які користувач вводить ім'я комп'ютера, на якому він хоче встановити службу, ім'я служби і її опис, місце розміщення сценарію, що запускається в якості служби, а також параметри доступу, необхідні для установки віддалених з'єднань.

Зверніть увагу на кнопку BROWSE, яка знаходиться поруч з полем, в якому користувач вказує шлях до сценарію. При натисканні на неї користувачі можуть перегортати каталоги для вказівки необхідного файлу, подібно до того, як це робиться в більшості Windows-додатків. Для забезпечення даної функціональності HTA використовує об'єкт UserAccounts.CommonDialog. Цей об'єкт надає стандартне діалогове вікно відкриття файлу (File Open). На жаль, він є тільки в Windows XP. Однак якщо ви явно даному об'єкту, тому сценарій може працювати і на комп'ютерах з Windows 2000 і більш новими версіями. Більш докладний опис об'єкта UserAccounts.CommonDialog можна знайти за адресою: http://www.microsoft.com/technet/scriptcenter/resources/qanda/jan05/hey0128.mspx .

Крім можливості гортання каталогів, в HTA є вбудована довідкова система, доступ до якої користувач може отримати, клацнувши по посиланню help. В цьому випадку відбувається не перехід за адресою в Internet, а генерується подія onclick, що, в свою чергу, ініціює запуск процедури helpdoc. Дана процедура викликає вікно Microsoft Internet Explorer (IE), в якому відображається довідка про використання даної форми HTA.

Коли користувач натискає в вікні інтерфейсу кнопку Install Service, сценарій викликає процедуру getfile, показану в Лістингу 1. Дана процедура шукає на цільовому комп'ютері в каталозі Admin $ system32 файл srvany.exe. Програма srvany.exe, наявна в будь-якому пакеті Windows Resource Kit, являє собою службу Windows, яка може запускати інший додаток. Створення призначених для користувача служб за допомогою srvany.exe описується в статті aspx?scid=http://support.microsoft.com:80/support/kb/articles/q137/8/90.asp&%20NoWebContent=1> http://www.support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q137/8/90.asp& NoWebContent = 1 .

Якщо процедура getfile не може знайти файл srvany.exe, то виводиться вікно повідомлення про помилку, в якому користувачеві пропонується вказати місце розміщення файлу через інтерфейс HTA. Після того як користувач вказав шлях, процедура викликає функцію VBScript InStr, яка шукає в описі шляху рядок ftp, щоб визначити, де слід шукати файл srvany.exe - в мережевому каталозі або на сайті FTP. У компанії, в якій я працюю, для зберігання утиліт і інших файлів використовується сайт FTP. Якщо з'ясовується, що srvany.exe зберігається на сайті FTP, процедура звертається до об'єкта HttpRequest (Microsoft.XMLHTTP), за допомогою якого даний файл завантажується в каталог Admin $ system32, що ілюструє код в лістингу 1, позначений міткою A. Якщо ж файл srvany .exe знаходиться в разделяемом мережевому каталозі, тоді викликається об'єкт FileSystemObject бібліотеки Microsoft Scripting Runtime, за допомогою якого файл копіюється в каталог Admin $ system32 (див. фрагмент з міткою B лістингу 1). З об'єктом FileSystemObject багато, ймовірно, вже знайомі, але, можливо, не всім доводилося працювати з об'єктом HttpRequest, який є складовою частиною об'єктної моделі документа XML, Microsoft XML Document Object Model (DOM). Тому нижче я дам короткий опис того, як даний об'єкт використовується процедурою getfile.

Об'єкт HttpRequest може застосовуватися для відсилання HTTP-запиту за будь-якою адресою URL, прослухати відповідь і обробки відповіді виконавчим механізмом XML DOM. У нашому випадку процедура getfile направляє через HTTP запит файлу на FTP-сайт і передає отриману відповідь об'єкту Stream (adodb.stream). Об'єкт Stream входить до складу ActiveX Data Objects (ADO) і може використовуватися для читання, записи і управління потоками довічних даних або тексту. У нашому випадку об'єкт Stream використовується для запису відповіді в двійковий файл на клієнтському комп'ютері.

Як в HTA реалізується запуск сценарію в якості служби

Тепер, коли ми знаємо, як працює інтерфейс HTA, давайте розглянемо, як HTA запускає сценарій в якості служби. Цей процес охоплює підключення до цільового комп'ютера, на якому буде запускатися служба, створення на ньому відповідної служби, настройку необхідних для даної служби параметрів в реєстрі і відображення ходу виконання сценарію.

Підключення до цільового комп'ютера. Для підключення до цільового комп'ютера, а також для отримання і передачі інформації, необхідної для коректного функціонування служби, HTA використовує можливості інтерфейсу Windows Management Instrumentation (WMI). Щоб створювати служби на віддаленому комп'ютері, потрібно володіти привілеями адміністратора, тому в разі необхідності в формі HTA можна вказувати альтернативні параметри облікового запису для підключення до віддаленого комп'ютера. Якщо ви вже є адміністратором віддаленого комп'ютера, то ці текстові поля можна залишити незаповненими.

Після підключення до комп'ютера виконується пошук папки% systemroot%, для чого використовується властивість SystemDirectory класу Win32_OperatingSystem. Отримавши ці дані, HTA може копіювати необхідні файли (в першу чергу це файл srvany.exe і сам сценарій, який повинен бути запущений в якості служби) в потрібне місце і занести цю інформацію до реєстру, щоб служба могла "знати", де шукати потрібні їй файли. Якщо HTA не може скопіювати файли, то в цьому випадку буде зроблена спроба відобразити мережевий диск (Z: на Admin $ system32) з використанням заданих альтернативних параметрів облікового запису, з тим щоб спробувати скопіювати файли. Якщо і в цьому випадку скопіювати файли не вдається, сценарій завершує виконання.

Створення служби. Створення служби на цільовому комп'ютері здійснюється шляхом виклику методу Create класу Win32_BaseService. Даному методу може бути передано до 12 параметрів. У розглянутій формі HTA використовується тільки частина з них.

  • Перший параметр визначає ім'я служби. В даному випадку це значення знаходиться в змінної Service, яке HTA витягує з другого текстового поля інтерфейсу.
  • Другий параметр задає коротке ім'я служби (display name). Тут також використовується значення, що знаходиться в змінній Service.
  • Третій параметр являє собою повний (fully qualified) шлях до виконуваного файлу, який реалізує функціональність служби (в даному випадку їм є srvany.exe).
  • Четвертий параметр визначає тип служби. В даному випадку в HTA задається тип "власний процес" (Own Process), чому відповідає число 16. Це означає, що сценарій буде запускатися у вигляді окремого процесу. Для більшої наочності уявлення типу служби при аналізі коду HTA іншими користувачами даний тип служби визначається константою з ім'ям OWN_ PROCESS.
  • П'ятим параметром встановлюється рівень критичності помилки, відповідної нагоди, коли після перезавантаження комп'ютера метод Create не може запуститися. У сценарії HTA для цього служить константа NORMAL_ERROR_CONTROL, в якій заданий рівень критичності Normal (значення 1), який означає, що при виникненні даної помилки користувачеві буде надіслано повідомлення.
  • Шостий параметр визначає тип запуску служби. У даному сценарії HTA даний параметр встановлюється в Automatic; це вказує на те, що служба буде запускатися при кожному перезапуску комп'ютера.
  • Сьомий параметр визначає, чи може служба інтерактивно взаємодіяти з робочим столом. У нашому випадку в сценарії HTA використовується константа NOT _INTERACTIVE, що забороняє службі інтерактивну взаємодію.

Щоб ознайомитися з іншими параметрами методу Create, зверніться до статті asp?url=/library/en-us/wmisdk/wmi/create_method_in_class_win32_baseservice.asp> http://www.msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/create_method_in_class_win32_baseservice.asp .

Налаштування параметрів служби в реєстрі. Без відповідного редагування реєстру служба не запуститься. Для внесення необхідних змін до реєстру сценарій HTA звертається до класу WMI StdRegProv (Лістинг 2). Даний клас надає методи для запису і читання даних з реєстру.

Спочатку створюється розділ реєстру HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / Services / service_name, де service _ name відповідає імені створюваної служби. Потім додається з'єднання Parameters. Далі, як показано у фрагменті з міткою B лістингу 2, в цей розділ додається два параметра. Перший з них називається Application, йому призначається тип даних REG_SZ і записується значення, що відповідає описам до сервера сценаріїв WScript (через який буде виконуватися сценарій, який запускається в якості служби) і шлях до файлу сценарію. Другий параметр називається Descpition. Йому також призначається тип REG_SZ і він буде містити опис служби, яке витягується сценарієм HTA з третього текстового поля інтерфейсу HTA. Додавання опису дуже корисно, оскільки той, хто буде переглядати список служб через відповідне вікно панелі управління, буде розуміти, що робить дана служба.

Запуск служби. Після внесення необхідних змін до реєстру цільового комп'ютера служба готова до запуску. Для запуску служби викликається метод StartService класу Win32_ Service. Слід пам'ятати, що після внесення будь-яких змін в код сценарію необхідно перезапустити відповідну службу, щоб внесені зміни вступили в силу.

Відображення ходу виконання сценарію. Для відображення ходу виконання сценарію, запущеного в якості служби, відкривається вікно IE. Використання вікна IE в даному випадку необхідно, оскільки інші прийоми тут працювати не будуть. Ми не можемо використовувати, наприклад, функцію VBScript MsgBox або метод Popup об'єкта WScript.Shell, оскільки це призведе до припинення виконання сценарію HTA. І хоча в сценарії HTA викликається вікно повідомлень, що пропонує користувачеві вказати шлях до srvany.exe, якщо сценарій не може знайти цю утиліту сам, в даному випадку припинення не є критичною, оскільки без цих даних сценарій в будь-якому випадку виконуватися не зможе. Метод Echo тут також не годиться, оскільки він є внутрішнім для виконавчих середовищ WScript і CScript, а сценарії HTA використовують для свого виконання механізми програми mshta.exe. Відобразити хід виконання в інтерфейсі HTA також не можна, оскільки це буде виглядати як "зависання" сценарію. І навіть якщо сценарій буде продовжувати виконуватися, ви все одно не побачите ніяких повідомлень про хід виконання. Ці повідомлення будуть виведені тільки по завершенні роботи сценарію або при перериванні його виконання внаслідок виникнення будь-якої помилки. Якщо ж вибрати пункт IE, то HTA може виводити звіт про хід виконання протягом усього часу виконання сценарію.

Як адаптувати сценарій

Як згадувалося вище, сценарії, які повинні бути запущені постійно, є першими кандидатами на запуск у вигляді служб. Прикладом такого сценарію може служити MoveFiles.vbs, текст якого показаний в лістингу 3. У даному сценарії за допомогою об'єкта FileSystemObject виконується перенесення з локального каталогу C: TempImages всіх файлів, збережених користувачем, на деякий мережевий ресурс. Зверніть увагу, що даний сценарій не надає звіт про результати виконання, в ньому також відсутня обробка помилок. Тому, якщо ви захочете використовувати його в промисловій експлуатації, слід зробити його більш надійним, додавши код обробки помилок і генерації звіту про результати.

Важливо розуміти, що в сценарії, який ви плануєте запускати в якості служби, повинні бути абсолютно виключені будь-які можливості втручання користувача в його виконання. В іншому випадку це може привести до порушення його роботи. Наприклад, якщо в сценарії, запускається через сервер WScript, використовується функція MsgBox, то він виведе відповідне вікно повідомлення і призупиниться до тих пір, поки не буде натиснута будь-яка з кнопок в даному вікні. Однак це вікно може і не відобразитися на екрані, наприклад в тому випадку, якщо даний сценарій запущений в контексті облікового запису, відмінною від тієї, під якою ви локально зареєструвалися на комп'ютері. Відповідно, в даній ситуації сценарій буде призупинено на невизначений час. Цей сценарій можна було б запустити через Cscript, проте в даному випадку є ризик появи на екрані вікна командного рядка, якщо були задані певні параметри служби.

Звідси випливає висновок, що в таких сценаріях необхідно виключити використання функції MsgBox і методу Popup. Також слід уникати використання методу Echo об'єкта WScript. Однак якщо ви хочете задіяти в сценарії метод Echo для подальшої налагодження, тоді можна додати в початок сценарію наступний рядок (див. Фрагмент з міткою A лістингу 3):

WScript.interactive = False

При цьому висновок всіх підказок буде відключений.

Якщо ви хочете видалити службу HTAcreated, то в Microsoft TechNet Script Center ( http://www.microsoft.com/technet/scriptcenter/default.mspx ) Є сценарій, за допомогою якого можна видаляти цю службу як на локальному, так і на віддаленому комп'ютерах.

Інструментарій для роботи

Для того щоб запускати сценарії системного адміністрування, необхідно мати хороші інструменти. Якщо потрібно запускати сценарії за розкладом, то у вашому розпорядженні їх, щонайменше, два. У більшості випадків служба «Призначені завдання» (Schedule Tasks) цілком придатна для запуску сценаріїв. Однак якщо потрібно, щоб сценарій запускався постійно або необхідний механізм негайного оповіщення при збої роботи сценарію, то в цьому випадку слід звернути увагу на технологію запуску сценаріїв в якості служб.

Лістинг 1. Підпрограма Getfile

Sub getfile

On Error Resume Next

If Srvanyfile.value = "" Then

MsgBox "Please enter either an FTP site address or local or network" & _

"File name and path.", VbOKOnly, "Path required"

Srvanyfile.focus

Exit Sub

End If

ProgressWindow.focus

sSmyfile = Srvanyfile.Value

If Instr (lcase (sSmyfile), "ftp") Then

ProgressWindow.document.body.insertAdjacentHTML "beforeEnd", _

"Coping Srvany.exe to:" & strComputer & "Admin $ system32
"

Set oHTTP = CreateObject ( "Microsoft.XMLHTTP")

oHTTP.open "Get", sSmyfile, False

oHTTP.send ()

Set oStream = CreateObject ( "adodb.stream")

oStream.type = adTypeBinary

oStream.open

oStream.write oHTTP.responseBody

If Mapdrive = vbYes Then

oStream.savetofile "Z: Srvany.exe", adSaveCreateOverWrite

Else

oStream.savetofile "" & strComputer & _

"Admin $ system32Srvany.exe", adSaveCreateOverWrite

End If

oStream.close

If Err 0 Then

OnError "Could not copy Srvany.exe to" & strComputer, Err.Description

Err.Clear

Exit Sub

End If

Else

ProgressWindow.document.body.insertAdjacentHTML "beforeEnd", _

"Coping Srvany.exe to:" & strComputer & "Admin $ system32
"

FSO.CopyFile sSmyfile, "" & strComputer & "Admin $ system32Srvany.exe"

If Err 0 Then

OnError "Could not copy Srvany.exe to" & strComputer, Err.Description

Err.Clear

Exit Sub

End If

End If

RunScript

End Sub

Лістинг 2. Код HTA для модифікації реєстру

Set RegService = SWBemlocator.ConnectServer (strComputer, _

"Rootdefault", UserName, Password)

Set objRegProv = RegService.Get ( "StdRegProv")

If Err 0 Then

OnError "Could not connect to remote registy!", Err.Description

Removesrv = msgbox ( "Would you like to remove" & Service & "from" & _

"The list of services on the remote computer?", VbYesNo, "Remove Service")

If Removesrv = vbYes Then RemoveService

Err.Clear

Exit Sub

End If

strKeyPath = "SYSTEMCurrentControlSetServices" & Service

objRegProv.CreateKey HKEY_LOCAL_MACHINE, strKeyPath & "Parameters"

strKeyPath1 = strKeyPath & "Parameters"

objRegProv.SetStringValue HKEY_LOCAL_MACHINE, strKeyPath1, _

"Application", Windir & "WScript.exe" & Windir & "" & File

objRegProv.SetStringValue HKEY_LOCAL_MACHINE, strKeyPath, _

"Description", Chr (34) & Descriptions.value & Chr (34)

Лістинг 3. MoveFiles.vbs

Dim FSO, Files, Folder, Filename

WScript.interactive = False

On Error Resume Next

Set FSO = CreateObject ( "Scripting.FileSystemObject")

Do

runmovejob

WScript.Echo "Waiting 30 seconds"

WScript.Sleep 30000

Петля

Sub runmovejob

Про помилку Відновіть далі

Встановити папку = FSO.GetFolder ("C: TempImages")

Встановити файли = папка. Файли

WScript.Echo "перевірка папки на нові файли" & folder.path

Для кожного objFile у файлах

WScript.Echo "Знайдений файл" & objFile.path

Ім'я файлу = objFile.Name

FSO.MoveFile folder.path & "" & objFile.Name, _

"ім'я сервера" і "objFile.Name"

Якщо Err 0, то WScript.Echo "Помилка переміщення файлу" _

& Помилка Опис: Вихід із Sub

WScript.Echo "Переміщений файл C: TempImages" та ім'я файлу

Ім'я файлу = ""

Далі

Кінець Під

Aspx?
Asp?

Новости

Banwar.org
Наша совместная команда Banwar.org. Сайт казино "Пари Матч" теперь доступен для всех желающих, жаждущих волнения и азартных приключений.