Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] [решено] VBS: мониторинг процессов и уведомление на email (http://forum.oszone.net/showthread.php?t=272262)

novi 17-11-2013 23:25 2256810

[решено] 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"
Спасибо, что дочитали до сюда :)

Iska 20-11-2013 01:20 2258222

Код:

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


novi 28-11-2013 22:52 2263376

Iska, спасибо большое за пример, но немного не то.

Iska 29-11-2013 00:46 2263444

novi, поясните, что именно Вас не устраивает, либо — что я понял из Вашего техзадания неверно.

novi 29-11-2013 21:53 2264062

Вложений: 1
Iska,
При загрузке ОС, выполняется автовход, скрипт (в автозагрузке) другой, не тот что указал в шапке темы, запускает мои определённые программы, штук 20.
Далее, уже скрипт который в шапке, добавлен в "планировщик заданий", который запускает мой скрипт каждые 10 минут, и проверяет наличие запущенных процессов. Если процесс закрылся, то скрипт его запускает. Скрипт сам в памяти висит только до тех пор, пока все не проверит, потом закрывается.
Также в моём скрипте важная строчка:
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 2 'use '2' for NTLM
или
strSmtpAuth="no"
, тобы не логиниться.

Проверив Ваш скрипт, получается следующее.
Скрипт постоянно висит в памяти. Даже если программы не запущена, он их не запускает, а просто висит. Попытка запустить вручную программу и потом её в ручную закрыть получаю ошибку. После появлении ошибки скрипт выгружается.
Может конечно из-за того что я неправильно скорректировал ваш скрипт под себя, а именно smtp в скрипте.
Подскажите что изменить, чтобы без авторизации отправлялись письма?

Iska 30-11-2013 01:43 2264171

novi, ясненько. Давайте уточним: приложения, которые запускает скрипт в автозагрузке, и приложения, за процессами которых должен следить и вновь запускать второй скрипт — одни и те же?

Цитата:

Цитата novi
Проверив Ваш скрипт, получается следующее.
Скрипт постоянно висит в памяти. »

Совершенно верно. Поскольку он подписывается на уведомления о событиях Wbem. После чего просто «ждёт» события завершения любого процесса, проверяя их (событий) поступление раз в секунду.

Цитата:

Цитата novi
Даже если программы не запущена, он их не запускает, а просто висит. »

В техзадании этого не было. Теперь (если ответ на вопрос в начале поста утвердительный) — будет. Делаем?

Цитата:

Цитата novi
Попытка запустить вручную программу и потом её в ручную закрыть получаю ошибку. После появлении ошибки скрипт выгружается.
Может конечно из-за того что я неправильно скорректировал ваш скрипт под себя, а именно smtp в скрипте. »

Всё возможно. Я ведь Вашего кода не вижу. Во всяком случае, коль до попытки создания сообщения доходит — значит, завершение процесса отслеживает.

Цитата:

Цитата novi
Подскажите что изменить, чтобы без авторизации отправлялись письма? »

Без авторизации? Нет ничего проще:
Код:

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

Но разве такие сервера остались?

novi 30-11-2013 10:36 2264269

Цитата:

Цитата Iska
Давайте уточним: приложения, которые запускает скрипт в автозагрузке, и приложения, за процессами которых должен следить и вновь запускать второй скрипт — одни и те же? »

Да, одни и те же, т.к. эти приложения могут самостоятельно выгрузится.

Цитата:

Цитата Iska
В техзадании этого не было. Теперь (если ответ на вопрос в начале поста утвердительный) — будет. Делаем? »

Обязательно. :)

Цитата:

Цитата Iska
Но разве такие сервера остались? »

Есть причини по которым нужно именно так.

В принципе скрипт сверху, этим всем и занимался. Тока не всё умел делать :) С вашей точки зрения он криво написан?

Iska 01-12-2013 07:03 2264728

Пробуйте:
читать дальше »
Код:

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, рабочий каталог отличен от каталога приложения и т.п.) — говорите, будем усложнять логику.

Цитата:

Цитата novi
т.к. эти приложения могут самостоятельно выгрузится. »

Например?

Цитата:

Цитата novi
Есть причини по которым нужно именно так. »

Поделитесь ими.

Цитата:

Цитата novi
В принципе скрипт сверху, этим всем и занимался. Тока не всё умел делать С вашей точки зрения он криво написан? »

Не знаю — не смотрел ;).

novi 01-12-2013 11:47 2264789

Вложений: 1
Цитата:

Цитата Iska
Пробуйте: »

Хм... интересно получается.
1 вариант проверил: не запуская программ, запустил скрипт. Скрипт указанные программы запустил, в диспетчере задач они видны, а в нижней панели "панель задач", их нету :), т.е. они я так понимаю запущены в фоне.
Идём далее, с помощью диспетчера задач, выгружаем принудительно одну из программ запущенных скриптом, и вылетает ошибка. Выложил скрин.

2 вариант проверил: с начало запустил все свои программы указанные в скрипте, они нормально отображаются в диспетчере задач. Запускаю скрипт, он ещё раз их запускает, и те которые запустил именно скрипт их не видно. А в диспетчере задач их стало в два раза больше. Т.е. в диспетчере задач следующая картина: по два процесса каждой программы.

Оба варианта не оч гуд. Я наверно это не сказал. Запуск программ происходит как в обычном режиме (т.е. если бы мы сами ткнули мышкой на ярлык программы), т.е. запустил программу, и она отобразилась в панеле задач.

Цитата:

Цитата Iska
Как и просили, отсылка без авторизации. »

Спасибо, это очень нужно.

Цитата:

Цитата Iska
Например? »

В шапке писал, продублирую.
Бывает такое, что приложения которые скрипт запускает, до конца не запускаются smile. (Это происходит например: запущено 30 программ, по истечении например 2-3-4 недель, эти программы в памяти уже занимаю не 50 мб, а от 70 до 100МБ, после этого скрипт не всегда может запустить эту программу.) Например мои приложения когда полностью запущены занимают в памяти 50МБ, проходит время, эти приложения могут съесть ОЗУ до 100 МБ, (ОЗУ на хосте хватает, не внём дело 100%) так вот, когда скрипт запускает приложение, оно загружается до 20МБ и вылетает. А если в тот же момент самому ткнуть на ярлык приложения, оно 100% запустится. Я не могу понять из-за чего это, но и не всегда это происходит. Есть предположения только, не хватает дескрипторов ресурсов ОС Windows. Также прочитал про интерактивный и не интерактивный режим запуска, возможно из-за этого приложение полностью не может загрузится. Т.е. мой скрипт неправильно написан для режима запуска. В общем загадка :)

Цитата:

Цитата Iska
Поделитесь ими. »

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

Цитата:

Цитата Iska
Не знаю — не смотрел . »

OK, ваш код выглядит и вправду скромнее :)

Цитата:

Цитата Iska
Если запуск каких-то приложений отличается от обычного (минимизация/скрытие окна, приоритет отличен от 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
и т.д.

Вы правы, в идеале хотелось бы получить именно минимизацию. Приоритет пусть будет стандартный, как если бы мы запустили приложение вручную, тыкнув по ярлыку.
И также Вы верно подметили, есть часть (не все) приложений, которые умеют скрываться в трей :).

Iska 01-12-2013 13:13 2264827

Цитата:

Цитата novi
а в нижней панели "панель задач", их нету »

Ух ты! Это как так получилось?

Давайте уточним, выложенный мною скрипт (с Вашими путями, разумеется) Вы запускали обычным двойным щелчком из Проводника? Или как-то иначе, например, из-под Диспетчера задач?

Цитата:

Цитата novi
т.е. они я так понимаю запущены в фоне. »

Да нет, самый обычный запуск.

Цитата:

Цитата novi
Выложил скрин. »

Не вижу ;).

Цитата:

Цитата novi
2 вариант проверил: с начало запустил все свои программы указанные в скрипте, они нормально отображаются в диспетчере задач. Запускаю скрипт, он ещё раз их запускает, и те которые запустил именно скрипт их не видно. А в диспетчере задач их стало в два раза больше. Т.е. в диспетчере задач следующая картина: по два процесса каждой программы. »

Всё верно.

Цитата:

Цитата novi
Разрешено только для внутренней сети. К хосту имеют доступ несколько человек, »

Ясно.

Цитата:

Цитата novi
в идеале хотелось бы получить именно минимизацию. »

Пробуйте:
читать дальше »
Код:

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


novi 01-12-2013 13:34 2264833

Вложений: 1
Очень прошу добавьте пожалуйста в последний вариант скрипта, проверку на самого себя. Мол если запущен, снова не запускать.
А то если два раза скрипт запустить он, проги по второму разу запускает, и 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

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

Iska 01-12-2013 14:19 2264859

Цитата:

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

Попробуем. Но будет с ограничениями.

Цитата:

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

Минимизирует время реагирования. Уведомления идут в любом случае, мы на них просто временно синхронно «подписываемся».

Цитата:

Цитата novi
Странно, а он есть , прикреплен. »

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

Цитата:

Цитата novi
Ругается на строчку: .Send »

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

novi 01-12-2013 14:29 2264863

Цитата:

Цитата 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


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

novi 01-12-2013 15:25 2264890

Может попробовать явно в Ваш вариант кода добавить такие параметры как:
читать дальше »
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"


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

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

Iska 01-12-2013 16:01 2264913

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

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


Пока без проверки на вторичный запуск.

novi 01-12-2013 16:06 2264920

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

Iska 01-12-2013 16:08 2264923

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

novi 01-12-2013 16:10 2264925

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
и т.д.

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


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

Iska 01-12-2013 16:18 2264928

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


novi 01-12-2013 16:30 2264934

Цитата:

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

Да, всегда, 100% загружается приложение.

Цитата:

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

Извините, Вы снова правы, проверил на другой программе, отображаются на панели в минимизированном состоянии как нужно.

Iska 01-12-2013 16:35 2264938

А с Вашими приложениями добавленная пауза не помогла?

novi 01-12-2013 16:42 2264943

Iska, смотрите какая получается ситуация с моими приложениями.
Они в данный момент запущены. И если я запускаю скрипт, то он снова делает запуск тех же самых приложений.
Пример:
В диспетчере задач и соответственно на панель задач запущено 20 программ notepad*.exe
notepad01.exe
notepad02.exe
notepad03.exe
notepad04.exe
и т.д.

если после этого я запускаю скрипт, то в диспетчер задач
появляются процессы дубли.
notepad01.exe
notepad01.exe
notepad02.exe
notepad02.exe
notepad03.exe
notepad03.exe
notepad04.exe
notepad04.exe
и т.д.

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

Iska 04-12-2013 06:25 2266612

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

Цитата Iska
А с Вашими приложениями добавленная пауза не помогла? »

Цитата:

Цитата novi
Iska, смотрите какая получается ситуация с моими приложениями.
Они в данный момент запущены. И если я запускаю скрипт, то он снова делает запуск тех же самых приложений.
читать дальше »
Пример:
В диспетчере задач и соответственно на панель задач запущено 20 программ notepad*.exe
notepad01.exe
notepad02.exe
notepad03.exe
notepad04.exe
и т.д.
если после этого я запускаю скрипт, то в диспетчер задач
появляются процессы дубли.
notepad01.exe
notepad01.exe
notepad02.exe
notepad02.exe
notepad03.exe
notepad03.exe
notepad04.exe
notepad04.exe
и т.д.

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

Вы не будете сами запускать приложения. Понимаете? Не будете. Этим будет заниматься сам скрипт.

novi 04-12-2013 15:06 2266847

Цитата:

Цитата Iska
Вы не будете сами запускать приложения. Понимаете? Не будете. Этим будет заниматься сам скрипт. »

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

Батник лежит в автозагрузке
Кода батника примерно следующий:

несколько строк вызова других программ (они запускаются единожды и не требуют вмешательства), не относящихся к скрипту.
и далее сам вызов моих программ которые будут указаны в скрипте.
cd C:\Prorgamma\myproject\01\
start project01.exe
timeout /t 10
cd C:\Prorgamma\myproject\02\
start project02.exe
timeout /t 10
и т.д.


и вот в конец этого батника хотел добавить вызов вашего скрипта. Я так думаю что будет логично.

Цитата:

Цитата Iska
если бы в код добавить проверку того что уже запущено, а не то что он сам сразу запускает, думаю эти дубли бы не пошли. »

Поэтому имхо это нужно.

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

Цитата:

Цитата Iska
Вы не будете сами запускать приложения. Понимаете? Не будете. Этим будет заниматься сам скрипт. »

А вот если в вкратце отвечать на этот вопрос, то буду, изредка, но буду.

Iska 04-12-2013 15:40 2266865

Цитата:

Цитата novi
Как бы правильнее сказать, изредка нужно будет выключить программу ненадолго, на пару минут (это время может быть как чуть больше так и чуть меньше, во общем есть причины), и снова запустить. Ваш код скрипта это не позволит сделать, т.к. сразу будет снова запуск приложения. »

Естественно — это входит в явное противоречие с мониторингом. Просто так «снимать»/запускать скрипт нецелесообразно — подписка-то останется, сервер Wbem будет всё более и более нагружаться. Надо подумать. Вам явно какой-нибудь GUI нужен с ручным управлением сим процессом. Что у Вас есть? .Net есть? PowerShell есть?

novi 05-12-2013 00:32 2267220

Цитата:

Цитата Iska
Естественно — это входит в явное противоречие с мониторингом. »

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

Цитата:

Цитата Iska
Просто так «снимать»/запускать скрипт нецелесообразно »

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

Iska 05-12-2013 08:46 2267272

Я, конечно, извиняюсь, но осмелюсь напомнить:
Цитата:

Цитата Iska
Что у Вас есть? .Net есть? PowerShell есть? »


novi 05-12-2013 10:45 2267313

Цитата:

Цитата Iska
Что у Вас есть? .Net есть? PowerShell есть? » »

.Net есть, powershell тоже.

novi 09-12-2013 18:43 2269490

Iska, вроде бы правильно написал :)

Iska 09-12-2013 21:41 2269608

Цитата:

Цитата novi
Iska, вроде бы правильно написал »

Вижу ;). Рисование и отладка интерфейса на PowerShell весьма неспешное дело. Скоро точно не ждите.

novi 09-12-2013 22:14 2269638

Iska, понял, сорри. :)
Тут подумал, а что если добавить в Ваш текущий код скрипта
это:

Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate,(debug)}!\\.\root\CIMV2")
If objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad2.exe'").Count = 0 Then

только не знаю в какую именно строчку впихнуть и в каком виде.
Может это и будет проверкой процесса?

novi 16-01-2014 20:25 2290447

Вечер добрый, пока пишется скрипт, можете его чуть чуть поменять чтобы он не постоянно висел в памяти, а запускался, проверял и выгружался?

Iska 16-01-2014 23:34 2290575

Цитата:

Цитата novi
пока пишется скрипт, »

Увы, не пишется скрипт. Никак не пишется :(. Visual Studio я, оказывается, давно уже удалил, а для PowerShell пока катастрофически не хватает знаний.

Цитата:

Цитата 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 objSWbemObjectEx

Dim elem
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 objSWbemObjectEx  = objSWbemServicesEx.Get("Win32_ProcessStartup").SpawnInstance_
objSWbemObjectEx.ShowWindow = SW_SHOWMINNOACTIVE

For Each elem In arrProcesses
        If objSWbemServicesEx.ExecQuery("SELECT ExecutablePath FROM Win32_Process WHERE ExecutablePath = '" & Replace(elem, "\", "\\") & "'").Count = 0 Then
                With WScript.CreateObject("CDO.Message")
                        .From    = "windows@myservermail.ru"
                        .To      = "мой-емейл@myservermail.ru"
                        .Subject  = "Process [" & elem & "] closed."
                       
                        If objSWbemServicesEx.Get("Win32_Process").Create(elem, WScript.CreateObject("Scripting.FileSystemObject").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
                               
                                .Update
                        End With
                       
                        .Send
                End With
        End If
Next

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

WScript.Quit 0


Теперь сравнение будет идти по полному пути к исполняемому файлу.

novi 17-01-2014 21:46 2291148

Iska, замечательно, спасибо большое. То, что нужно.


Время: 03:34.

Время: 03:34.
© OSzone.net 2001-