Показать полную графическую версию : [решено] [решено] VBS: мониторинг процессов и уведомление на email
Форумчане, день добрый помогите допилить скрипт. Сам не силен.
Сам скрипт 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"
Спасибо, что дочитали до сюда :)
Option Explicit
Const cdoSendUsingPort = 2
Const cdoBasic = 1
Const strSchema = "http://schemas.microsoft.com/cdo/configuration/"
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 objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Do
Set objSWbemObjectEx = collSWbemObjectSet.NextEvent.TargetInstance
For Each elem In arrProcesses
If objSWbemObjectEx.Name = objFSO.GetFileName(elem) Then
With WScript.CreateObject("CDO.Message")
.From = "account@mail.ru"
.To = "account@yandex.ru"
.Subject = "Process [" & objFSO.GetFileName(elem) & "] closed."
If objSWbemServicesEx.Get("Win32_Process").Create(elem, objFSO.GetParentFolderName(elem), Nothing, 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") = "smtp.mail.ru"
.Item(strSchema & "sendusing") = cdoSendUsingPort
.Item(strSchema & "smtpserverport") = 25
.Item(strSchema & "smtpauthenticate") = cdoBasic
.Item(strSchema & "sendusername") = "account@mail.ru"
.Item(strSchema & "sendpassword") = "password"
.Update
End With
.Send
End With
Exit For
End If
Next
Loop
Set objFSO = Nothing
Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing
WScript.Quit 0
Iska, спасибо большое за пример, но немного не то.
novi, поясните, что именно Вас не устраивает, либо — что я понял из Вашего техзадания неверно.
Iska,
При загрузке ОС, выполняется автовход, скрипт (в автозагрузке) другой, не тот что указал в шапке темы, запускает мои определённые программы, штук 20.
Далее, уже скрипт который в шапке, добавлен в "планировщик заданий", который запускает мой скрипт каждые 10 минут, и проверяет наличие запущенных процессов. Если процесс закрылся, то скрипт его запускает. Скрипт сам в памяти висит только до тех пор, пока все не проверит, потом закрывается.
Также в моём скрипте важная строчка:
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 2 'use '2' for NTLM
или
strSmtpAuth="no"
, тобы не логиниться.
Проверив Ваш скрипт, получается следующее.
Скрипт постоянно висит в памяти. Даже если программы не запущена, он их не запускает, а просто висит. Попытка запустить вручную программу и потом её в ручную закрыть получаю ошибку. После появлении ошибки скрипт выгружается.
Может конечно из-за того что я неправильно скорректировал ваш скрипт под себя, а именно smtp в скрипте.
Подскажите что изменить, чтобы без авторизации отправлялись письма?
novi, ясненько. Давайте уточним: приложения, которые запускает скрипт в автозагрузке, и приложения, за процессами которых должен следить и вновь запускать второй скрипт — одни и те же?
Проверив Ваш скрипт, получается следующее.
Скрипт постоянно висит в памяти. »
Совершенно верно. Поскольку он подписывается на уведомления о событиях Wbem. После чего просто «ждёт» события завершения любого процесса, проверяя их (событий) поступление раз в секунду.
Даже если программы не запущена, он их не запускает, а просто висит. »
В техзадании этого не было. Теперь (если ответ на вопрос в начале поста утвердительный) — будет. Делаем?
Попытка запустить вручную программу и потом её в ручную закрыть получаю ошибку. После появлении ошибки скрипт выгружается.
Может конечно из-за того что я неправильно скорректировал ваш скрипт под себя, а именно smtp в скрипте. »
Всё возможно. Я ведь Вашего кода не вижу. Во всяком случае, коль до попытки создания сообщения доходит — значит, завершение процесса отслеживает.
Подскажите что изменить, чтобы без авторизации отправлялись письма? »
Без авторизации? Нет ничего проще:
With WScript.CreateObject("CDO.Message")
.From = "monitor1@fabrikam.com"
.To = "admin1@fabrikam.com"
.Subject = "Atl-dc-01 down"
.Textbody = "Atl-dc-01 is no longer accessible over the network."
.Send
End With
Но разве такие сервера остались?
Давайте уточним: приложения, которые запускает скрипт в автозагрузке, и приложения, за процессами которых должен следить и вновь запускать второй скрипт — одни и те же? »
Да, одни и те же, т.к. эти приложения могут самостоятельно выгрузится.
В техзадании этого не было. Теперь (если ответ на вопрос в начале поста утвердительный) — будет. Делаем? »
Обязательно. :)
Но разве такие сервера остались? »
Есть причини по которым нужно именно так.
В принципе скрипт сверху, этим всем и занимался. Тока не всё умел делать :) С вашей точки зрения он криво написан?
Пробуйте:
Option Explicit
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 objFSO = WScript.CreateObject("Scripting.FileSystemObject")
' Первоначальный запуск процессов
For Each elem In arrProcesses
If objSWbemServicesEx.Get("Win32_Process").Create(elem, objFSO.GetParentFolderName(elem), Nothing, 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
Set objSWbemObjectEx = collSWbemObjectSet.NextEvent.TargetInstance
For Each elem In arrProcesses
If objSWbemObjectEx.Name = objFSO.GetFileName(elem) Then
With WScript.CreateObject("CDO.Message")
.From = "monitor1@fabrikam.com"
.To = "admin1@fabrikam.com"
.Subject = "Atl-dc-01 down"
If objSWbemServicesEx.Get("Win32_Process").Create(elem, objFSO.GetParentFolderName(elem), Nothing, lngProcessID) = 0 Then
.Textbody = Now() & vbTab & "Process [" & elem & "] successfully started."
Else
.Textbody = Now() & vbTab & "Can't create process [" & elem & "]."
End If
.Send
End With
Exit For
End If
Next
Loop
Set objFSO = Nothing
Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing
WScript.Quit 0
Как и просили, отсылка без авторизации. Если запуск каких-то приложений отличается от обычного (минимизация/скрытие окна, приоритет отличен от Normal, рабочий каталог отличен от каталога приложения и т.п.) — говорите, будем усложнять логику.
т.к. эти приложения могут самостоятельно выгрузится. »
Например?
Есть причини по которым нужно именно так. »
Поделитесь ими.
В принципе скрипт сверху, этим всем и занимался. Тока не всё умел делать С вашей точки зрения он криво написан? »
Не знаю — не смотрел ;).
Пробуйте: »
Хм... интересно получается.
1 вариант проверил: не запуская программ, запустил скрипт. Скрипт указанные программы запустил, в диспетчере задач они видны, а в нижней панели "панель задач", их нету :), т.е. они я так понимаю запущены в фоне.
Идём далее, с помощью диспетчера задач, выгружаем принудительно одну из программ запущенных скриптом, и вылетает ошибка. Выложил скрин.
2 вариант проверил: с начало запустил все свои программы указанные в скрипте, они нормально отображаются в диспетчере задач. Запускаю скрипт, он ещё раз их запускает, и те которые запустил именно скрипт их не видно. А в диспетчере задач их стало в два раза больше. Т.е. в диспетчере задач следующая картина: по два процесса каждой программы.
Оба варианта не оч гуд. Я наверно это не сказал. Запуск программ происходит как в обычном режиме (т.е. если бы мы сами ткнули мышкой на ярлык программы), т.е. запустил программу, и она отобразилась в панеле задач.
Как и просили, отсылка без авторизации. »
Спасибо, это очень нужно.
Например? »
В шапке писал, продублирую.
Бывает такое, что приложения которые скрипт запускает, до конца не запускаются smile. (Это происходит например: запущено 30 программ, по истечении например 2-3-4 недель, эти программы в памяти уже занимаю не 50 мб, а от 70 до 100МБ, после этого скрипт не всегда может запустить эту программу.) Например мои приложения когда полностью запущены занимают в памяти 50МБ, проходит время, эти приложения могут съесть ОЗУ до 100 МБ, (ОЗУ на хосте хватает, не внём дело 100%) так вот, когда скрипт запускает приложение, оно загружается до 20МБ и вылетает. А если в тот же момент самому ткнуть на ярлык приложения, оно 100% запустится. Я не могу понять из-за чего это, но и не всегда это происходит. Есть предположения только, не хватает дескрипторов ресурсов ОС Windows. Также прочитал про интерактивный и не интерактивный режим запуска, возможно из-за этого приложение полностью не может загрузится. Т.е. мой скрипт неправильно написан для режима запуска. В общем загадка :)
Поделитесь ими. »
Разрешено только для внутренней сети. К хосту имеют доступ несколько человек, не хотелось бы светить логин и пасс почты для авторизации.
Не знаю — не смотрел . »
OK, ваш код выглядит и вправду скромнее :)
Если запуск каких-то приложений отличается от обычного (минимизация/скрытие окна, приоритет отличен от Normal, рабочий каталог отличен от каталога приложения и т.п.) — говорите, будем усложнять логику. »
Путь запуска приложений следующий:
c:\Programma\Notepad01\notepad01.exe
c:\Programma\Notepad02\notepad02.exe
c:\Programma\Notepad03\notepad03.exe
c:\Programma\Notepad04\notepad04.exe
c:\Programma\Notepad05\notepad05.exe
и т.д.
Вы правы, в идеале хотелось бы получить именно минимизацию. Приоритет пусть будет стандартный, как если бы мы запустили приложение вручную, тыкнув по ярлыку.
И также Вы верно подметили, есть часть (не все) приложений, которые умеют скрываться в трей :).
а в нижней панели "панель задач", их нету »
Ух ты! Это как так получилось?
Давайте уточним, выложенный мною скрипт (с Вашими путями, разумеется) Вы запускали обычным двойным щелчком из Проводника? Или как-то иначе, например, из-под Диспетчера задач?
т.е. они я так понимаю запущены в фоне. »
Да нет, самый обычный запуск.
Выложил скрин. »
Не вижу ;).
2 вариант проверил: с начало запустил все свои программы указанные в скрипте, они нормально отображаются в диспетчере задач. Запускаю скрипт, он ещё раз их запускает, и те которые запустил именно скрипт их не видно. А в диспетчере задач их стало в два раза больше. Т.е. в диспетчере задач следующая картина: по два процесса каждой программы. »
Всё верно.
Разрешено только для внутренней сети. К хосту имеют доступ несколько человек, »
Ясно.
в идеале хотелось бы получить именно минимизацию. »
Пробуйте:
Option Explicit
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
'Set objSWbemObjectEx = collSWbemObjectSet.NextEvent.TargetInstance
With collSWbemObjectSet.NextEvent.TargetInstance
For Each elem In arrProcesses
If .Name = objFSO.GetFileName(elem) Then
With WScript.CreateObject("CDO.Message")
.From = "monitor1@fabrikam.com"
.To = "admin1@fabrikam.com"
.Subject = "Atl-dc-01 down"
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
.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
Очень прошу добавьте пожалуйста в последний вариант скрипта, проверку на самого себя. Мол если запущен, снова не запускать.
А то если два раза скрипт запустить он, проги по второму разу запускает, и 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
Вроде прикрепилось.
Очень прошу добавьте пожалуйста в последний вариант скрипта, проверку на самого себя. Мол если запущен, снова не запускать. »
Попробуем. Но будет с ограничениями.
Вопрос, обязательно в коде нужно делать так, чтобы скрипт висел постоянно в процессах?
Очень интересно, почему вы пошли по этому пути, а не по пути, запустил-проверил-выгрузился. »
Минимизирует время реагирования. Уведомления идут в любом случае, мы на них просто временно синхронно «подписываемся».
Странно, а он есть , прикреплен. »
Должно быть, когда я читал, Вы ещё файл в тот пост не вложили.
Ругается на строчку: .Send »
Наверное, всё-таки, какая-то авторизация требуется. Какая именно требуется, определить можете, понятное дело, только Вы сами, тут я Вам не помощник, в телепаты не гожусь ;). Оставьте пока скрипт и ковыряйте исключительно отправку сообщения, пока не найдёте рабочий вариант для Вашего почтового сервера. Первый вариант выложенного мною скрипта с авторизацией корректно отрабатывал на почтовых серверах mail.ru и yandex.ru.
Наверное, всё-таки, какая-то авторизация требуется. Какая именно требуется, определить можете, понятное дело, только Вы сами, тут я Вам не помощник, в телепаты не гожусь . Оставьте пока скрипт и ковыряйте исключительно отправку сообщения, пока не найдёте рабочий вариант для Вашего почтового сервера. Первый вариант выложенного мною скрипта с авторизацией корректно отрабатывал на почтовых серверах mail.ru и yandex.ru. »
В моем случае вот рабочий вариант отправки письма, из скрипта первого сообщения темы.
Function sendMail()
strSmtpServer="mx.myservermail.ru (windows@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
Я вас понял, не уверен что у меня получится это сделать, но попробую.
Может попробовать явно в Ваш вариант кода добавить такие параметры как:
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"
Только как правильно их добавить не понимаю.
В моем первом сообщение вызывается функция, а далее внизу скрипта она уже описыватся подробно.
Пробуйте, свёл вместе:
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
Пока без проверки на вторичный запуск.
Iska, супер, отлично, то что нужно.
Благодарю :)
Так приложения начали на панели задач отображаться? Или всё так же отсутствуют?
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
и т.д.
то, отсутствуют :), но в диспетчере задач висят.
Если брать во внимания приложения которые Вы указали в скрипте, то присутствуют и запускаются в минимизированном состоянии.
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
Знаете что? Вот Вы выше пишете, что при запуске «ручками» приложения загружаются корректно. Так всегда происходит? »
Да, всегда, 100% загружается приложение.
Что если мы добавим некоторую паузу в процесс последовательного запуска приложений? Начнём с десяти секунд, а Вы, если приложения начнут отображаться на Панели задач, попробуйте поуменьшать это значение. »
Извините, Вы снова правы, проверил на другой программе, отображаются на панели в минимизированном состоянии как нужно.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.