1

Тема: VBS: Помогите с DateDiff.

Здравствуйте! Скрипт смотрит 2 сервера:
1. 2003R2
2. 2003R2 x64
Если какой-либо перегружался то выдается сообщение - как давно. Все работало несколько месяцев!
Вероятно, после очередных обновлений 1 сервер выдает что он перегружен -720 часов назад(минус не опечатка!),  2 сервер  13 часов назад! перегружались оба вчера!

Поправьте кто силен плиз!:|

strComputer = "server1"
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
 
For Each objOS in colOperatingSystems
    dtmBootup = objOS.LastBootUpTime
    dtmLastBootupTime = WMIDateStringToDate(dtmBootup)
    dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now)
If dtmSystemUptime < 77 Then
    Wscript.Echo dtmSystemUptime 

End If
Next


strComputer = "server2"
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
 
For Each objOS in colOperatingSystems
    dtmBootup = objOS.LastBootUpTime
    dtmLastBootupTime = WMIDateStringToDate(dtmBootup)
    dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now)
If dtmSystemUptime < 77 Then
    Wscript.Echo dtmSystemUptime 

End If
Next
 

Function WMIDateStringToDate(dtmBootup)
    WMIDateStringToDate = CDate(Mid(dtmBootup, 5, 2) & "/" & _
        Mid(dtmBootup, 7, 2) & "/" & Left(dtmBootup, 4) _
            & " " & Mid (dtmBootup, 9, 2) & ":" & _
                Mid(dtmBootup, 11, 2) & ":" & Mid(dtmBootup,13, 2))
End Function

2

Re: VBS: Помогите с DateDiff.

bnp322, сложно сказать. Надо проходить в отладчике и смотреть, где что не так.

Само свойство «.LastBootUpTime» выдаёт для «неправильного» сервера корректное значение?

3

Re: VBS: Помогите с DateDiff.

значения выдаваемые серверами однотипны если я добавляю отладочное эхо в скрипт:

strComputer = "server1"
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
 
For Each objOS in colOperatingSystems
    dtmBootup = objOS.LastBootUpTime
    dtmLastBootupTime = WMIDateStringToDate(dtmBootup)

    Wscript.Echo dtmLastBootupTime

    dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now)

If dtmSystemUptime < 77 Then
    Wscript.Echo dtmSystemUptime 

End If
Next


strComputer = "server2"
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
 
For Each objOS in colOperatingSystems
    dtmBootup = objOS.LastBootUpTime
    dtmLastBootupTime = WMIDateStringToDate(dtmBootup)

    Wscript.Echo dtmLastBootupTime

    dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now)
If dtmSystemUptime < 77 Then
    Wscript.Echo dtmSystemUptime 

End If
Next
 

Function WMIDateStringToDate(dtmBootup)
    WMIDateStringToDate = CDate(Mid(dtmBootup, 5, 2) & "/" & _
        Mid(dtmBootup, 7, 2) & "/" & Left(dtmBootup, 4) _
            & " " & Mid (dtmBootup, 9, 2) & ":" & _
                Mid(dtmBootup, 11, 2) & ":" & Mid(dtmBootup,13, 2))
End Function

получаю последовательно:

08.09.2012 2:08:16     (мой коммент!- перегрузка была сегодня в 2.08 реально)

-709

08.08.2012 22:45:54  (мой коммент!-перегрузка была вчера в 22.45 реально)

15

4

Re: VBS: Помогите с DateDiff.

bnp322, меня интересовало значение «LastBootUpTime» до обработки функцией «WMIDateStringToDate()». И отчего такой странный формат даты — «MM.DD.YYYY»?! Что кажет функция «GetLocale()» на обоих серверах?

Попробуйте для начала использовать вместо функции «WMIDateStringToDate()» существующий, начиная с Windows XP, объект «SWbemDateTime»:

Option Explicit

Dim objSWbemDateTime

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx


Set objSWbemDateTime   = WScript.CreateObject("WbemScripting.SWbemDateTime")

strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

For Each objSWbemObjectEx In objSWbemServicesEx.InstancesOf("Win32_OperatingSystem")
    WScript.Echo objSWbemObjectEx.LastBootUpTime
    
    objSWbemDateTime.Value = objSWbemObjectEx.LastBootUpTime
    WScript.Echo objSWbemDateTime.GetVarDate()
Next

Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

Set objSWbemDateTime   = Nothing

WScript.Quit 0

5

Re: VBS: Помогите с DateDiff.

В реестре нашел HKEY_USERS\.DEFAULT\Control Panel\International\Locale   значение 00000419  оно одинаковое. Как взять функцию пока не знаю!:(

Ваш скрипт отрабатывает так(одинаково как я понял):
на XP:
20120809153127.375000+540
09.08.2012 15:31:27

на 2003R2 x64:
20120808224554.556767+540
08.08.2012 22:45:54

на 2003R2:
20120809020816.375000+540
09.08.2012 2:08:16

Ничего не проясняется !

6 (изменено: bnp322, 2012-08-09 13:16:03)

Re: VBS: Помогите с DateDiff.

сделал так:

strComputer = "server1"
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
 
For Each objOS in colOperatingSystems
    dtmBootup = objOS.LastBootUpTime

    Wscript.Echo dtmLastBootupTime

    dtmLastBootupTime = WMIDateStringToDate(dtmBootup)
    dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now)

If dtmSystemUptime < 77 Then
    Wscript.Echo dtmSystemUptime 

End If
Next


strComputer = "server2"
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
 
For Each objOS in colOperatingSystems
    dtmBootup = objOS.LastBootUpTime

    Wscript.Echo dtmLastBootupTime

    dtmLastBootupTime = WMIDateStringToDate(dtmBootup)
    dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now)

If dtmSystemUptime < 77 Then
    Wscript.Echo dtmSystemUptime 

End If
Next
 

Function WMIDateStringToDate(dtmBootup)
    WMIDateStringToDate = CDate(Mid(dtmBootup, 5, 2) & "/" & _
        Mid(dtmBootup, 7, 2) & "/" & Left(dtmBootup, 4) _
            & " " & Mid (dtmBootup, 9, 2) & ":" & _
                Mid(dtmBootup, 11, 2) & ":" & Mid(dtmBootup,13, 2))
End Function

На первом эхо получил пустое окно только кнопка ОК, а далее как при первом отладочном скрипте!!!


Т.е. примерно так:

получаю последовательно:

пустота!!!

-709

08.08.2012 22:45:54

15


7

Re: VBS: Помогите с DateDiff.

Ничего не проясняется sad!

Напротив.

получаю последовательно:



08.09.2012 2:08:16     (мой коммент!- перегрузка была сегодня в 2.08 реально)



-709



08.08.2012 22:45:54  (мой коммент!-перегрузка была вчера в 22.45 реально)



15

и:

на 2003R2 x64:

20120808224554.556767+540

08.08.2012 22:45:54



на 2003R2:

20120809020816.375000+540

09.08.2012 2:08:16

Видите разницу?

8

Re: VBS: Помогите с DateDiff.

Как взять функцию пока не знаю!sad

WScript.Echo GetLocale()

9 (изменено: bnp322, 2012-08-09 15:24:33)

Re: VBS: Помогите с DateDiff.

09.08 и 08.08  эта разница лишь оттого что один перегружался 8 числа второй девятого, для этого в скобках я писал реальную дату перегрузки . Дабы ни у кого не возникла ложная версия.:)

сразу после перезагрузки сервера 1 скрипт говорит что перегрузка была "-721"  часов назад , а на втором сервере  "0" часов! вот в чем проблем.

Функция WScript.Echo GetLocale()  везде дает 1049.


Вроде увидел!!!

А где проблема и как ее.... и почему?:mad:

10

Re: VBS: Помогите с DateDiff.

А где проблема и как ее.... и почему?mad

Раз у Вас и там, и там «1049», тогда и мне не понятно, из-за чего проблема.

Попробуйте всё-таки так:

Option Explicit

Dim strComputer

Dim objSWbemDateTime
Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim lngUptime


Set objSWbemDateTime   = WScript.CreateObject("WbemScripting.SWbemDateTime")
Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")

For Each strComputer In Array("server1", "server2")
    Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
    
    For Each objSWbemObjectEx In objSWbemServicesEx.InstancesOf("Win32_OperatingSystem")
        objSWbemDateTime.Value = objSWbemObjectEx.LastBootUpTime
        
        lngUptime = DateDiff("h", objSWbemDateTime.GetVarDate(), Now())
        
        If lngUptime < 77 Then
            WScript.Echo lngUptime
        End If
    Next
    
    Set objSWbemServicesEx = Nothing
Next

Set objSWbemLocator    = Nothing
Set objSWbemDateTime   = Nothing

WScript.Quit 0

11 (изменено: bnp322, 2012-08-09 17:57:03)

Re: VBS: Помогите с DateDiff.

да это адекватно работает на всех серверах!
Но я перегрузил сервер 2 и выяснил что он "глючил" аналогично первому (на первоначальном скрипте), а я всех ввел в заблуждение, что с ним все оК! Простите!:|

Спасибо!!!

А в чем была проблема?

Да и как в Ваш скрипт встроить отправку письма по условию типа сервер1 - 1час назад ...

было так:

If dtmSystemUptime < 7 Then
 
   stringx= dtmSystemUptime & " Часов назад server перегрузился "

Set Message = CreateObject("CDO.Message") 
Message.To = "zzz@хххх.ru"
Message.From = "ууу@хххх.ru"
Message.Subject = "server"
Message.TextBody = stringx
Message.BodyPart.Charset = "windows-1251"
Set iConf = CreateObject("CDO.Configuration")
Set Flds = iConf.Fields
Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "10.10.10.2"
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10
Flds.Update
Message.Configuration = iConf
Message.Send 
End If

12

Re: VBS: Помогите с DateDiff.

А в чем была проблема?

Я не пробовал Ваш скрипт под отладчиком.

Да и как в Ваш скрипт встроить отправку письма по условию типа сервер1 - 1час назад ...

Поясните. Не понял.

13

Re: VBS: Помогите с DateDiff.

скрипт запускается несколько раз в сутки ~6
Если один или оба  сервера перегружались менее чем 7 часов назад шлется почтовое уведоление через почтовый сервер в локальной сети, с сообщением: "Х часов назад такой-то сервер перегрузился"

14

Re: VBS: Помогите с DateDiff.

Сделал так:

Option Explicit

Dim strComputer, stringx, Message, iConf, Flds

Dim objSWbemDateTime
Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx
Dim lngUptime


Set objSWbemDateTime   = WScript.CreateObject("WbemScripting.SWbemDateTime")
Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")

For Each strComputer In Array("server1", "server2")
    Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
    
    For Each objSWbemObjectEx In objSWbemServicesEx.InstancesOf("Win32_OperatingSystem")
        objSWbemDateTime.Value = objSWbemObjectEx.LastBootUpTime
        
        lngUptime = DateDiff("h", objSWbemDateTime.GetVarDate(), Now())
        
        If lngUptime < 7 Then
'            WScript.Echo lngUptime


    stringx= lngUptime & " Часов назад " & strComputer & " перегрузился "


Set Message = CreateObject("CDO.Message") 
Message.To = "xx@yy.ru"
Message.From = "servers@yy.ru"
Message.Subject = "servers"
Message.TextBody = stringx
Message.BodyPart.Charset = "windows-1251"
Set iConf = CreateObject("CDO.Configuration")
Set Flds = iConf.Fields
Flds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "10.10.10.2"
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
Flds.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 10
Flds.Update
Message.Configuration = iConf
Message.Send


        End If
    Next
    
    Set objSWbemServicesEx = Nothing
Next

Set objSWbemLocator    = Nothing
Set objSWbemDateTime   = Nothing

WScript.Quit 0

Спасибо за помощь!

15

Re: VBS: Помогите с DateDiff.

Ну и славненько. А то я никак не мог связать такие разные вещи как:

If dtmSystemUptime < 77 Then

по условию типа сервер1 - 1час назад ...

Если один или оба  сервера перегружались менее чем 7 часов

Всё-таки, правильным ТЗ оказалось последнее .