Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Старожил


Сообщения: 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

Последний раз редактировалось glukin, 16-03-2017 в 11:29.


Отправлено: 11:24, 16-03-2017 | #39