Перейти на главную страничку сайта (список статей, файлы для скачивания)
Автор статьи - Александр Нагаев, г. Москва
В этой статье я расскажу, как можно мониторить состояние запущенных сервисов, автоматически запуская их при непредвиденной остановке и отсылая при этом по почте сообщение. Для того, чтобы наш скрипт работал как служба, т.е. работал и после выхода из системы, будем использовать бесплатную программку из Resource Kit: Autoexnt.exe - AutoExNT Service. Если есть некая служба или несколько служб, и они не должны по каким-то причинам внезапно останавливаться, а в момент запуска необходимо сделать ещё несколько каких-то операций, то стандартных средств восстановления служб в Windows XP/2003 будет недостаточно.
Воспользуемся возможностями технологии WMI. Описывать эту технологию я здесь не буду, но на этом сайте вы можете найти краткие описания, например эту статью. Также вы можете купить хорошую книгу "Администрирование Windows с помощью WMI и WMIC" (Попов А.В., Шикин Е.А.).
Скрипт состоит из основного тела и двух процедур.
Основное тело выглядит следующим образом:
Dim objSink, fso, LogFile, objService, rComp, Service1, Service2 'Ваш компьютер rComp = "." 'Ваши две любые службы Service1 = "Themes" 'Темы Service2 = "Spooler" 'Служба печати Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_") 'Создаём объект для работы с файловой системой Set fso = Wscript.CreateObject("Scripting.FileSystemObject") 'Открываем файл для записи и создаём его, если его не существует Set LogFile = fso.OpenTextFile("C:\immSrvASNC.Log", 8, True) 'Подключаемся к пространству имён на машине rComp Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & rComp & "\root\cimv2") 'Временный фильтр на события с опросам каждые 15 секунд objService.ExecNotificationQueryAsync objSink, _ "Select * From __InstanceModificationEvent Within 15 Where TargetInstance ISA 'Win32_Service'" 'Задержка 1 секунда Do WScript.Sleep 1000 Loop
Следующим этапом является обработчик событий:
Sub SINK_OnObjectReady(objLatestEvent, objAsyncContext) Dim xDate If LCase(objLatestEvent.TargetInstance.Name) = LCase(Service1) Then If objLatestEvent.TargetInstance.State = "Stopped" Then xDate = Date & " " & Time tcValue = objLatestEvent.TargetInstance.StartService Call sendMessage(tcValue, xDate, Service1) End If Elseif LCase(objLatestEvent.TargetInstance.Name) = LCase(Service2) Then If objLatestEvent.TargetInstance.State = "Stopped" Then xDate = Date & " " & Time tcValue = objLatestEvent.TargetInstance.StartService Call sendMessage(tcValue, xDate, Service2) End If End If End Sub
И, наконец, пошлём письма, если сервисы грохнутся:
Sub sendMessage(runState, xDate, Named) On Error Resume Next Dim tempStr, objMessage, WshNetwork Set objMessage = CreateObject("CDO.Message") Set WshNetwork = WScript.CreateObject("WScript.Network") 'Проверка состояния сервисов Select Case runState Case 0 tempStr = "был успешно запущен." Case Else tempStr = "запуск этого сервиса невозможен." End Select 'Создание сообщения objMessage.To = "myEmail@mail.ru" objMessage.From = WshNetwork.ComputerName & "@ourdomain.ru" objMessage.Subject = "Automessage from " & WshNetwork.ComputerName objMessage.TextBody = xDate & " cервис " & Named & " перешёл в состояние СТОП." & _ VbCrLf & Date & " " & Time & " " & tempStr objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = _ "ourdomain.ru" objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = _ 25 objMessage.Configuration.Fields.Update objMessage.Send If Err.Number <> 0 Then LogFile.WriteLine "Отправка письма невозможна по причине: " & Err.Description Err.Clear End If LogFile.WriteLine xDate & " cервис " & Named & " перешёл в состояние СТОП." & _ VbCrLf & Date & " " & Time & " " & tempStr LogFile.WriteLine Set objMessage = Nothing Set WshNetwork = Nothing End Sub
В строке скрипта
objMessage.To = "myEmail@mail.ru"
исправьте myEmail@mail.ru на свой e-mail.
В строке скрипта
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = _ "ourdomain.ru"
исправьте ourdomain.ru на ваш smtp сервер, например, mail.ourdomain.ru.
Теперь можно сохранить скрипт как test.vbs на диске c:\ (обратите внимание на название, так как оно прописано в AutoExNt.bat). Если хотите сохранить в другом месте, то нужно подправить AutoExNt.bat. Теперь тестируем: просто запускаем скрипт, а затем пробуем остановить службы печати и «Темы», обновляем и видим, что службы снова запущены, а письма отосланы (если установлен SMTP, а он есть в компонентах Windows вместе с IIS) и появились записи в файле журнала на диске С:\immSrvASNC.Log.
На этом не остановимся и создадим bat-файл следующего содержания:
@echo off cscript.exe "C:\test.vbs"
Сохраним под именем AutoExNt.bat. Теперь нужно провернуть такой финт: копируем этот файл и файлы из Resource Kit (autoexnt.exe, instexnt.exe, servmess.dll) в директорию %WinDir%\system32\. Фишка в том, что autoexnt.exe запускает AutoExNt.bat как сервис… Ну и соответственно процесс cscript.exe.
Не надо забывать про права на запуск сервисов, а также на подключение к пространству имён. И вообще, лучше быть админом компа, как минимум.
Теперь проинсталлируем сервис AutoExNt.exe. В командном окне или в батнике напишем:
instexnt install
Запустим сервис AutoExNt, соответственно запустится и скрипт. Можно разлогиниваться и быть уверенным, что мониторинг продолжается. Сервис AutoExNt через несколько минут сам остановится, но скрипт будет прекрасно продолжать работать и оставаться в процессах. Так что не обращайте на этот сервис внимания. Для полной остановки нужно уничтожить процесс cscript.exe.
На этом всё. Кому интересно – попробуйте.
Все необходимые файлы для запуска этого примера вы можете скачать здесь (19 717 байт).
Перейти на главную страничку сайта (список статей, файлы для скачивания)
© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.