Старожил
Сообщения: 161
Благодарности: 5
|
Профиль
|
Отправить PM
| Цитировать
Iska, впрочем, если есть желание и время, можете попробовать, вот код для локалхоста, но нужен или win2003 server или winXP. Ибо на 7-ке все работает.
Скрытый текст
Код: 
File_Out1 = "C:\SNMP.txt"
File_Out2 = "C:\30.10.txt"
File_out3 = "C:\31.10.txt"
File_Date = "C:\date.txt"
File_NoSNMP = "C:\NoSNMP.txt"
Set objWmiLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWmiServices = objWmiLocator.ConnectServer("", "root\snmp\localhost")
Set objWmiNamedValueSet = CreateObject("WbemScripting.SWbemNamedValueSet")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set NFile1 = FSO.OpenTextFile(File_Out1, 2, True)
Set NFile2 = FSO.OpenTextFile(File_Out2, 2, True)
Set NFile3 = FSO.OpenTextFile(File_Out3, 2, True)
Set DateFile = FSO.OpenTextFile(File_Date, 2, True)
Set NoSNMP = FSO.OpenTextFile(File_NoSNMP, 2, True)
Dim arrComputers(256)
k = 0
For i = 0 To 0
For j = 0 To 255
arrComputers(k) = "127.0." + CStr(i) + "." + CStr(j)
k = k + 1
Next
Next
Dim strComputer
Dim objSWbemServicesEx
Dim objSWbemSink
Dim objSWbemNamedValueSet
Dim lngCount
Dim lngQueueCurrLength, lngQueueMaxLength
Dim i
' Максимальная длина очереди (в данном примере — сколько машин будут пинговаться одновременно),
' выбирается произвольно
lngQueueMaxLength = 10
' Текущая длина очереди
lngQueueCurrLength = 0
lngCount = UBound(arrComputers)
i = 0
Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\Root\CIMV2")
Set objSWbemSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
While (i <= lngCount) Or (lngQueueCurrLength > 0) ' Пингуем пока не кончатся компы и очередь
If (i <= lngCount) And (lngQueueCurrLength < lngQueueMaxLength) Then
' В коллекции «objSWbemNamedValueSet» будем передавать адрес/имя хоста (замечание: в данном конкретном случае
' сие, в принципе, необязательно, поскольку класс Win32_PingStatus и так содержит
' свойство «.Address», но тут показана сама технология передачи данных в процедуру асинхронной обработки)
Set objSWbemNamedValueSet = WScript.CreateObject("WbemScripting.SWbemNamedValueSet")
objSWbemNamedValueSet.Add "HostName", arrComputers(i)
' Все запросы будут обрабатываться в единственной процедуре обработки
objSWbemServicesEx.ExecQueryAsync objSWbemSink, "SELECT * FROM Win32_PingStatus WHERE ADDRESS = '" & arrComputers(i) & "'", , , , objSWbemNamedValueSet
i = i + 1
lngQueueCurrLength = lngQueueCurrLength + 1
Else
' Ожидаем, пока не будут обработаны все асинхронные запросы
WScript.Sleep 100
End If
Wend
objSWbemSink.Cancel
Set objSWbemSink = Nothing
Set objSWbemServicesEx = Nothing
NFile1.Close
NFile2.Close
NFile3.Close
NoSNMP.Close
DateFile.Close
WScript.Quit 0
'=============================================================================
'=============================================================================
' Процедура асинхронной обработки экземпляра объекта (замечание: в данном конкретном случае
' будет возвращаться единственный объект, однако, в большинстве случаев запросы
' возвращают множество объектов)
Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext)
Dim strComputer
strComputer = objWbemAsyncContext.Item("HostName")
If Not IsNull(objWbemObject.StatusCode) Then
If objWbemObject.StatusCode = 0 Then
objWmiNamedValueSet.Add "AgentAddress", strComputer
objWmiNamedValueSet.Add "AgentReadCommunityName", "public"
'on error resume next
If ClassExists(objWmiServices, "SNMP_RFC1213_MIB_system") Then
Set colSystem = objWmiServices.ExecQuery("SELECT sysName FROM SNMP_RFC1213_MIB_system",,, objWmiNamedValueSet)
For Each objSystem In colSystem
If (Right(objSystem.sysName,12)=".12345678901") Then
objSystem.sysName=Left(objSystem.sysName,Len(objSystem.sysName)-12) + ".m"
Else
objSystem.sysName=objSystem.sysName + ".m"
End If
NFile1.WriteLine objSystem.sysName + " IN A " + strComputer
Next
Else
' WScript.Echo "OK"
NoSNMP.WriteLine strComputer
End If
End If
End If
End Sub
'=============================================================================
'=============================================================================
' Процедура, вызываемая при завершении асинхронной обработки
Sub Sink_OnCompleted(iHResult, objWbemErrorObject, objWbemAsyncContext)
objWbemAsyncContext.DeleteAll
Set objWbemAsyncContext = Nothing
' Уменьшаем длину очереди
lngQueueCurrLength = lngQueueCurrLength - 1
'lngCount = lngCount - 1
End Sub
'==============================================================================
Function ClassExists(objSWbemServicesEx, strClassName)
Dim objSWbemObjectEx
ClassExists = False
For Each objSWbemObjectEx In objSWbemServicesEx.SubclassesOf()
If StrComp(objSWbemObjectEx.Path_.RelPath, strClassName, vbTextCompare) = 0 Then
ClassExists = True
' WScript.Echo "GOOD"
Exit Function
End If
Next
' WScript.Echo "BAD"
End Function
|