Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] [решено] VBS: мониторинг процессов и уведомление на email

Ответить
Настройки темы
VBS/WSH/JS - [решено] [решено] VBS: мониторинг процессов и уведомление на email

Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: novi
Дата: 23-01-2014
Описание: Исправил ошибки
Форумчане, день добрый помогите допилить скрипт. Сам не силен.
Сам скрипт vbs

Назначение скрипта: мониторинг запущенных процессов указанных в коде, при отсутствии запущенного процесса, запускать его, и отправлять email.
читать дальше »

Код: Выделить весь код
Option Explicit
Dim objSWbemServicesEx
Dim intProcessID

Dim strSMTPServer
Dim strSmtpPort
Dim strSmtpAuth
Dim strSmtpSsl
Dim strDate
Dim strSendingEmail
Dim strReportEmail
Dim objMessage

rem Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process")
rem Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate,(debug)}!\\.\root\CIMV2")
If objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad1.exe'").Count = 0 Then
    If objSWbemServicesEx.Get("Win32_Process").Create("c:\programma\01\notepad1.exe", Null, intProcessID) = 0 Then
Call sendMail
    End If      
End If 

Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate,(debug)}!\\.\root\CIMV2")
If objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad2.exe'").Count = 0 Then
    If objSWbemServicesEx.Get("Win32_Process").Create("c:\programma\02\notepad2.exe", Null, intProcessID) = 0 Then
Call sendMail
    End If      
End If 

Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate,(debug)}!\\.\root\CIMV2")
If objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad3.exe'").Count = 0 Then
    If objSWbemServicesEx.Get("Win32_Process").Create("c:\programma\03\notepad3.exe", Null, intProcessID) = 0 Then
Call sendMail
    End If      
End If 

Function sendMail()
strSmtpServer="mx server" ' имя почтового сервера
strSmtpPort=25
strSmtpAuth="no"
strSmtpSsl="no"
strDate=date
strSendingEmail="mail" ' Имя отправителя
strReportEmail="mail" ' Имя получателя
'WScript.Echo logPath & "/backup" & strDate & ".html"
Set objMessage = CreateObject("CDO.Message")
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSmtpServer
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = strSmtpPort
If strSmtpAuth = "yes" Then
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 2 'use '2' for NTLM authentication
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = strSmtpUser
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strSmtpPass
End If
If strSmtpSsl = "yes" Then
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
End If
objMessage.Configuration.Fields.Update
objMessage.Subject = "Notepad " & strDate & "."
objMessage.From = strSendingEmail
objMessage.To = strReportEmail
rem objMessage.HtmlBody = "Рестарт Notepad"
objMessage.TextBody = "Restart Notepad"
objMessage.Send
End Function

Программа notepad взята как тест. На самом деле будет не три программы, а около 30. Поэтому в примере, чтобы код был не большой указал всего 3. Какая длина при 30 программ думаю представляете. Возможно как-то это можно упростить, но я увы не знаю

Очень хочется добавить в функционал скрипта
1. В полях отправки email чтобы objMessage.Subject и objMessage.TextBody писались имена тех процессов которые были перезапущены. Например если закрылась программа notepad2, скрипт её запустил и отправил email где в полях Тема и тело письма писалось что это notepad2.exe
2. Не уверен что правильная структура кода проверки и запуска процесса, она хоть и работает, но не на 100%. Бывает такое что приложения которые скрипт запускает до конца не запускаются smile. Например мои приложения когда полностью запущены весят в памяти 50МБ, так вот, когда скрипт запускает приложение, оно загружается до 20МБ и вылетает. А если в тотже момент самому тыкнуть на ярлык приложение, оно 100% запустится. Я не могу понять из-за чего это, но и не всегда это происходит. Есть предположения только, не хватает дескрипторов ресурсов. Также прочитал про интерактивный и не интерактивный режим запуска, возможно из-за этого приложение полностью не может загрузится. Т.е. скрипт неправильно написан для режима запуска.
3. Для чего строка в скрипте ? 'WScript.Echo logPath & "/backup" & strDate & ".html"
Спасибо, что дочитали до сюда

Отправлено: 23:25, 17-11-2013

 

Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png error_mail.png
(8.2 Kb, 5 просмотров)

Очень прошу добавьте пожалуйста в последний вариант скрипта, проверку на самого себя. Мол если запущен, снова не запускать.
А то если два раза скрипт запустить он, проги по второму разу запускает, и wscript.exe процесс также дублируется в диспетчере задач, но и чтобы не получилось так, что нельзя было ещё какой нибудь скрипт запустить типа vbs но с другим кодом.
Вопрос, обязательно в коде нужно делать так, чтобы скрипт висел постоянно в процессах?
Очень интересно, почему вы пошли по этому пути, а не по пути, запустил-проверил-выгрузился.
Впринципе ваш вариант меня полностью устраивает, и даже сказать лучше, т.к. можно его (скрипт), вызвать из батника который при автовходе запускает программы. Последним в списке сделать.И дополнительно не прописывать в шэдулер.

Цитата Iska:
Ух ты! Это как так получилось? »
хз, мож из-за того что на вынь 8.1 запускаю тест. проверю на 2003. На вынь 2003 тоже самое. Если запущены программы, но не скрипт, после запуска скрипта, он их запускает снова.
Проверял на программе putty. Программу продублировал так как писал в своем посте выше.
Путь запуска приложений следующий:
d:\1\01\putty01.exe
d:\1\02\putty02.exe
d:\1\03\putty03.exe
d:\1\04\putty04.exe
d:\1\05\putty05.exe
и т.д.

Если в скрипте не менять пути и проги, то всё гуд запускает как положено, и как нужно
"C:\WINDOWS\system32\notepad.exe", "C:\WINDOWS\system32\calc.exe", "C:\WINDOWS\system32\mspaint.exe"

Цитата Iska:
Давайте уточним, выложенный мною скрипт (с Вашими путями, разумеется) Вы запускали обычным двойным щелчком из Проводника? Или как-то иначе, например, из-под Диспетчера задач? »
Всё верно, тока не проводник, а TotalCMD (Total Commander), думаю сути от проводника не меняет.
Из под диспетчера нет , этот геморрой ненужен

Цитата Iska:
Не вижу . »
Странно, а он есть , прикреплен. Сейчас сюда прикреплю, скрин от последнего скрипта.
Ругается на строчку: .Send

Вроде прикрепилось.

Последний раз редактировалось novi, 01-12-2013 в 13:58.


Отправлено: 13:34, 01-12-2013 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата novi:
Очень прошу добавьте пожалуйста в последний вариант скрипта, проверку на самого себя. Мол если запущен, снова не запускать. »
Попробуем. Но будет с ограничениями.

Цитата novi:
Вопрос, обязательно в коде нужно делать так, чтобы скрипт висел постоянно в процессах?
Очень интересно, почему вы пошли по этому пути, а не по пути, запустил-проверил-выгрузился. »
Минимизирует время реагирования. Уведомления идут в любом случае, мы на них просто временно синхронно «подписываемся».

Цитата novi:
Странно, а он есть , прикреплен. »
Должно быть, когда я читал, Вы ещё файл в тот пост не вложили.

Цитата novi:
Ругается на строчку: .Send »
Наверное, всё-таки, какая-то авторизация требуется. Какая именно требуется, определить можете, понятное дело, только Вы сами, тут я Вам не помощник, в телепаты не гожусь . Оставьте пока скрипт и ковыряйте исключительно отправку сообщения, пока не найдёте рабочий вариант для Вашего почтового сервера. Первый вариант выложенного мною скрипта с авторизацией корректно отрабатывал на почтовых серверах mail.ru и yandex.ru.

Отправлено: 14:19, 01-12-2013 | #12


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Наверное, всё-таки, какая-то авторизация требуется. Какая именно требуется, определить можете, понятное дело, только Вы сами, тут я Вам не помощник, в телепаты не гожусь . Оставьте пока скрипт и ковыряйте исключительно отправку сообщения, пока не найдёте рабочий вариант для Вашего почтового сервера. Первый вариант выложенного мною скрипта с авторизацией корректно отрабатывал на почтовых серверах mail.ru и yandex.ru. »
В моем случае вот рабочий вариант отправки письма, из скрипта первого сообщения темы.
читать дальше »
Function sendMail()
strSmtpServer="mx.myservermail.ru" ' тут указываюя имя своего почтового сервера
strSmtpPort=25
strSmtpAuth="no"
strSmtpSsl="no"
strDate=date
strSendingEmail="mail" ' тут указываю от кого слать, пишу например windows@myservermail.ru
strReportEmail="mail" ' тут указываю кому мой-емейл@myservermail.ru
'WScript.Echo logPath & "/backup" & strDate & ".html"
Set objMessage = CreateObject("CDO.Message")
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSmtpServer
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = strSmtpPort
If strSmtpAuth = "yes" Then
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 2 'use '2' for NTLM authentication
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = strSmtpUser
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strSmtpPass
End If
If strSmtpSsl = "yes" Then
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
End If
objMessage.Configuration.Fields.Update
objMessage.Subject = "Notepad " & strDate & "."
objMessage.From = strSendingEmail
objMessage.To = strReportEmail
rem objMessage.HtmlBody = "Рестарт Notepad"
objMessage.TextBody = "Restart Notepad"
objMessage.Send


Я вас понял, не уверен что у меня получится это сделать, но попробую.

Отправлено: 14:29, 01-12-2013 | #13


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Может попробовать явно в Ваш вариант кода добавить такие параметры как:
читать дальше »
strSmtpServer="mx.myservermail.ru" ' тут указываюя имя своего почтового сервера
strSmtpPort=25
strSmtpAuth="no"
strSmtpSsl="no"
strDate=date
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 2 'use '2' for NTLM authentication
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strSmtpServer
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = strSmtpPort


Предполагаю, что их нужно добавить перед этими строчками.
читать дальше »

.From = "monitor1@fabrikam.com"
.To = "admin1@fabrikam.com"
.Subject = "Atl-dc-01 down"


Только как правильно их добавить не понимаю.

В моем первом сообщение вызывается функция, а далее внизу скрипта она уже описыватся подробно.

Отправлено: 15:25, 01-12-2013 | #14


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Пробуйте, свёл вместе:
читать дальше »
Код: Выделить весь код
Option Explicit

Const cdoSendUsingPort = 2
Const cdoBasic = 1

Const strSchema = "http://schemas.microsoft.com/cdo/configuration/"

Const SW_SHOWMINIMIZED   = 2
Const SW_SHOWMINNOACTIVE = 7


Dim arrProcesses

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx

Dim elem
Dim objFSO

Dim lngProcessID


arrProcesses = Array("C:\WINDOWS\system32\notepad.exe", "C:\WINDOWS\system32\calc.exe", "C:\WINDOWS\system32\mspaint.exe")

strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecNotificationQuery("SELECT * From __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
Set objSWbemObjectEx   = objSWbemServicesEx.Get("Win32_ProcessStartup").SpawnInstance_

objSWbemObjectEx.ShowWindow = SW_SHOWMINNOACTIVE

Set objFSO             = WScript.CreateObject("Scripting.FileSystemObject")

' Первоначальный запуск процессов
For Each elem In arrProcesses
	If objSWbemServicesEx.Get("Win32_Process").Create(elem, objFSO.GetParentFolderName(elem), objSWbemObjectEx, lngProcessID) = 0 Then
		'WScript.Echo Now() & vbTab & "Process [" & elem & "] successfully started."
	Else
		WScript.Echo Now() & vbTab & "Can't create process [" & elem & "]."
	End If
Next

' Слежение за теми же процессами
Do
	With collSWbemObjectSet.NextEvent.TargetInstance
		For Each elem In arrProcesses
			If .Name = objFSO.GetFileName(elem) Then
				With WScript.CreateObject("CDO.Message")
					.From     = "windows@myservermail.ru"
					.To       = "мой-емейл@myservermail.ru"
					.Subject  = "Process [" & objFSO.GetFileName(elem) & "] closed."
					
					If objSWbemServicesEx.Get("Win32_Process").Create(elem, objFSO.GetParentFolderName(elem), objSWbemObjectEx, lngProcessID) = 0 Then
						.Textbody = Now() & vbTab & "Process [" & elem & "] successfully started."
					Else
						.Textbody = Now() & vbTab & "Can't create process [" & elem & "]."
					End If
					
					With .Configuration.Fields
						.Item(strSchema & "smtpserver")       = "mx.myservermail.ru"
						.Item(strSchema & "sendusing")        = cdoSendUsingPort
						.Item(strSchema & "smtpserverport")   = 25
						'.Item(strSchema & "smtpauthenticate") = cdoBasic
						'.Item(strSchema & "sendusername")     = "windows@myservermail.ru"
						'.Item(strSchema & "sendpassword")     = "password"
						
						.Update
					End With
					
					.Send
				End With
				
				Exit For
			End If
		Next
	End With
Loop

Set objFSO             = Nothing

Set objSWbemObjectEx   = Nothing
Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

Пока без проверки на вторичный запуск.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:01, 01-12-2013 | #15


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, супер, отлично, то что нужно.
Благодарю

Отправлено: 16:06, 01-12-2013 | #16


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Так приложения начали на панели задач отображаться? Или всё так же отсутствуют?

Отправлено: 16:08, 01-12-2013 | #17


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska,
Проверял на программе putty. Программу продублировал так как писал в своем посте выше.
Путь запуска приложений следующий:
d:\1\01\putty01.exe
d:\1\02\putty02.exe
d:\1\03\putty03.exe
d:\1\04\putty04.exe
d:\1\05\putty05.exe
и т.д.

то, отсутствуют , но в диспетчере задач висят.


Если брать во внимания приложения которые Вы указали в скрипте, то присутствуют и запускаются в минимизированном состоянии.

Отправлено: 16:10, 01-12-2013 | #18


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


novi, ясно. Должно быть та же ситуация, что Вы писали выше, когда они «не загружаются целиком».

Знаете что? Вот Вы выше пишете, что при запуске «ручками» приложения загружаются корректно. Так всегда происходит? Что если мы добавим некоторую паузу в процесс последовательного запуска приложений? Начнём с десяти секунд, а Вы, если приложения начнут отображаться на Панели задач, попробуйте поуменьшать это значение. Либо, напротив, увеличить, если не начнут отображаться.

читать дальше »
Код: Выделить весь код
Option Explicit

Const cdoSendUsingPort = 2
Const cdoBasic = 1

Const strSchema = "http://schemas.microsoft.com/cdo/configuration/"

Const SW_SHOWMINIMIZED   = 2
Const SW_SHOWMINNOACTIVE = 7


Dim arrProcesses

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx

Dim elem
Dim objFSO

Dim lngProcessID


arrProcesses = Array("C:\WINDOWS\system32\notepad.exe", "C:\WINDOWS\system32\calc.exe", "C:\WINDOWS\system32\mspaint.exe")

strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecNotificationQuery("SELECT * From __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
Set objSWbemObjectEx   = objSWbemServicesEx.Get("Win32_ProcessStartup").SpawnInstance_

objSWbemObjectEx.ShowWindow = SW_SHOWMINNOACTIVE

Set objFSO             = WScript.CreateObject("Scripting.FileSystemObject")

' Первоначальный запуск процессов
For Each elem In arrProcesses
	If objSWbemServicesEx.Get("Win32_Process").Create(elem, objFSO.GetParentFolderName(elem), objSWbemObjectEx, lngProcessID) = 0 Then
		'WScript.Echo Now() & vbTab & "Process [" & elem & "] successfully started."
	Else
		WScript.Echo Now() & vbTab & "Can't create process [" & elem & "]."
	End If
	
	WScript.Sleep 10 * 1000
Next

' Слежение за теми же процессами
Do
	With collSWbemObjectSet.NextEvent.TargetInstance
		For Each elem In arrProcesses
			If .Name = objFSO.GetFileName(elem) Then
				With WScript.CreateObject("CDO.Message")
					.From     = "windows@myservermail.ru"
					.To       = "мой-емейл@myservermail.ru"
					.Subject  = "Process [" & objFSO.GetFileName(elem) & "] closed."
					
					If objSWbemServicesEx.Get("Win32_Process").Create(elem, objFSO.GetParentFolderName(elem), objSWbemObjectEx, lngProcessID) = 0 Then
						.Textbody = Now() & vbTab & "Process [" & elem & "] successfully started."
					Else
						.Textbody = Now() & vbTab & "Can't create process [" & elem & "]."
					End If
					
					With .Configuration.Fields
						.Item(strSchema & "smtpserver")       = "mx.myservermail.ru"
						.Item(strSchema & "sendusing")        = cdoSendUsingPort
						.Item(strSchema & "smtpserverport")   = 25
						'.Item(strSchema & "smtpauthenticate") = cdoBasic
						'.Item(strSchema & "sendusername")     = "windows@myservermail.ru"
						'.Item(strSchema & "sendpassword")     = "password"
						
						.Update
					End With
					
					.Send
				End With
				
				Exit For
			End If
		Next
	End With
Loop

Set objFSO             = Nothing

Set objSWbemObjectEx   = Nothing
Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:18, 01-12-2013 | #19


Новый участник


Сообщения: 20
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Знаете что? Вот Вы выше пишете, что при запуске «ручками» приложения загружаются корректно. Так всегда происходит? »
Да, всегда, 100% загружается приложение.

Цитата Iska:
Что если мы добавим некоторую паузу в процесс последовательного запуска приложений? Начнём с десяти секунд, а Вы, если приложения начнут отображаться на Панели задач, попробуйте поуменьшать это значение. »
Извините, Вы снова правы, проверил на другой программе, отображаются на панели в минимизированном состоянии как нужно.

Отправлено: 16:30, 01-12-2013 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] [решено] VBS: мониторинг процессов и уведомление на email

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Отправка скриншота на email andrew_gurylyov@vk Скриптовые языки администрирования Windows 22 23-02-2012 11:52
VBS/WSH/JS - Помогите редактировать Autorun_Disable.vbs на Autorun_Enable.vbs nod201 Скриптовые языки администрирования Windows 0 05-12-2009 05:44
выключение servera на email kurt17 Microsoft Windows NT/2000/2003 4 22-07-2009 07:27
Уведомление на e-mail GSVG О сайте и форуме 4 17-03-2007 09:37
Уведомление о e- mail на телефон Sherla Мобильные ОС, смартфоны и планшеты 5 28-07-2003 22:31




 
Переход