목록 대신 IP 범위 검색

목록 대신 IP 범위 검색

IP 목록에 대한 파일을 보는 대신 범위를 살펴보고 싶습니다. 범위는 클래스 C만큼 커야 합니다. 이를 달성하기 위해 아래 코드를 편집하는 데 도움을 줄 수 있습니까? 서브넷 마스크가 255.255.0.0인 10.0.0.0을 검색하려고 합니다.

' NetworkFindInfo.vbs - Windows Logon Script.
' VBScript - Look up a computers info. 
' Author Chris Collins
' Version 1 - July 2018
' ----------------------------------------------------------' 

Option Explicit

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

Const PATH_TO_INPUT = "C:\Users\ccollins\Desktop\NetworkFindingInfo\ComputerList.txt"
Const PATH_TO_OUTPUT = "C:\Users\ccollins\Desktop\NetworkFindingInfo\ComputerInfo.csv"

Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")

Dim shl
Set shl = WScript.CreateObject("WScript.Shell")

Dim input
Set input = fso.OpenTextFile(PATH_TO_INPUT)

Dim output
Set output = fso.CreateTextFile(PATH_TO_OUTPUT, True)

output.WriteLine "Hostname,Computer Name,Domain,Serial Number,Make,Model,BIOS Version,Operating System,CPU,Memory (MB),Disk Drives,MAC Address"

Dim wmiService
Dim wmiResults

Dim hostname
Dim computername
Dim domain
Dim make
Dim model
Dim biosversion
Dim operatingSystem
Dim serialNumber
Dim cpu
Dim memory
Dim drives
Dim mac

Dim line
Dim exec
Dim pingResults
While Not input.AtEndOfStream
line = input.ReadLine
hostname = ""
computername = ""
domain = ""
make = ""
model = ""
biosversion = ""
operatingSystem = ""
serialNumber = ""
cpu = ""
memory = ""
drives = ""
mac = ""

Set exec = shl.Exec("ping -n 2 -w 1000 " & line)
pingResults = LCase(exec.StdOut.ReadAll)

If InStr(pingResults, "reply from") Then
On Error Resume Next

Set wmiService = GetObject("winmgmts:\\" & line & "\root\CIMV2")

If Not Err.Number = 0 Then
output.WriteLine line & ",Error: " & Err.Description
On Error GoTo 0
Else
On Error GoTo 0
hostname = line

Set wmiResults = wmiService.ExecQuery("SELECT * FROM Win32_BIOS", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

Dim item
For Each item In wmiResults
serialNumber = Trim(item.SerialNumber)
biosversion = Trim(item.SMBIOSBIOSVersion)
Next

Set wmiResults = wmiService.ExecQuery("SELECT * FROM Win32_ComputerSystem", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each item In wmiResults
make = Trim(item.Manufacturer)
model = Trim(item.Model)
computername = Trim(item.Name)
domain = Trim(item.Domain)
Next

Set wmiResults = wmiService.ExecQuery("SELECT * FROM Win32_OperatingSystem", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each item In wmiResults
operatingSystem = Trim(item.Name)
operatingSystem = Split(operatingSystem, "|")(0)
memory = Round(Trim(item.TotalVisibleMemorySize) / 1024, 2)
Next

Set wmiResults = wmiService.ExecQuery("SELECT * FROM Win32_Processor", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each item In wmiResults
cpu = Trim(item.Name)
Next

Set wmiResults = wmiService.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE PhysicalAdapter = 1", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each item In wmiResults
mac = Trim(item.MACAddress)
Next

Set wmiResults = wmiService.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType=3", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each item In wmiResults
drives = drives & Trim(item.DeviceID) & " " & Round(Trim(item.Size) / (1024^2), 2) & ";"
Next

output.WriteLine hostname & "," & computername & "," & domain & "," & serialNumber & "," & make & "," & model & "," & biosversion & "," & operatingSystem & "," & cpu & "," & memory & "," & drives & "," & mac
End If
Else
output.WriteLine line & ",No Response"
End If
Wend

output.Close
input.Close

Set wmiService = Nothing
Set wmiresults = Nothing

Msgbox("Done Collecting Data")

게다가 내 네트워크에는 이 코드가 멈추는 특정 IP가 있습니다. 계속 실행할 수 있는 방법이 있나요?

답변1

범위가 얼마나 크고 유연해야 하는지에 따라 다릅니다.

가장 간단한 형태로

baseIP="10.10."

for a=0 to 255
  for b=0 to 255

IP=baseIP&a&"."&b

<\Your code here>

  next b
next a

더 늦게

서브넷 검색과 유사한 것

main

sub main

Dim WshShell, oExec
Dim x

Set wshShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objInputFile = objFSO.OpenTextFile("c:\scripts\computers.txt",1)

Do until objInputFile.AtEndofStream
userIP = objInputFile.ReadLine


numBits=Mid(userIP,instr(1,userIP,"/")+1,3)
numIP=CDbl(2^(32-mid(userIP,instr(1,userIP,"/")+1,3)))
ip=Mid(userIP,1,instr(1,userIP,"/")-1)

a=Split(ip,".")
'Darn vbscript has signed numbers so -2 billion to pos 2 billion
' and ip's go 0 to 4 billion
'lame work around
If a(0)>127 Then offset=128 Else offset=0
a(0)=a(0)-offset

ipnum=CDbl((a(0)*256^3)+(a(1)*256^2)+(a(2)*256)+a(3))
ipEnd=CDbl(ipnum+numIP)

For x=ipnum To ipEnd

grab=Hex(x)
grab2=Mid("00000000"&grab,Len(grab)+1,8)

a=CLng("&h"&Mid(grab2,1,2))+offset
b=CLng("&h"&Mid(grab2,3,2))
c=CLng("&h"&Mid(grab2,5,2))
d=CLng("&h"&Mid(grab2,7,2))

newip=a&"."&b&"."&c&"."&d
WScript.echo "newip:"&newip

inventory(newip)
Next 

Loop

end sub

시작 및 끝 IP 주소

begIP="10.10.3.1"
endIP="10.10.10.1"

a=Split(begIP,".")
b=Split(endIP,".")
'Darn vbscript has signed numbers so -2 billion to pos 2 billion
' and ip's go 0 to 4 billion
'lame work around
If a(0)>127 Then offset=128 Else offset=0
a(0)=a(0)-offset
b(0)=b(0)-offset
ipnum=CDbl((a(0)*256^3)+(a(1)*256^2)+(a(2)*256)+a(3))

ipEnd=CDbl((b(0)*256^3)+(b(1)*256^2)+(b(2)*256)+b(3))

For x=ipnum To ipEnd

grab=Hex(x)
grab2=Mid("00000000"&grab,Len(grab)+1,8)

a=CLng("&h"&Mid(grab2,1,2))+offset
b=CLng("&h"&Mid(grab2,3,2))
c=CLng("&h"&Mid(grab2,5,2))
d=CLng("&h"&Mid(grab2,7,2))

newip=a&"."&b&"."&c&"."&d
WScript.echo "newip:"&newip
inventory(newip)

Next 
end sub

관련 정보