Oft ist es sinnvoll einen IP Plan zu haben, um zu dokumentieren, ob und welche IP-Adressen noch frei sind, welche Netze in Benutzung sind und eine Menge anderer Gründe. Klar, es gibt viele Tools, die das anbieten, aber was ist, wenn man solch eine Liste selber generieren möchte? Ich habe mir dies kurz zur Aufgabe gemacht und mir eine IP-Adressliste mit Excel erzeugt. Die zu scannenden Netze werden als Arbeitsblatt erzeugt. Enthalten sind dort die Adressen, die gescannt werden sollen. Zusätzlich gibt es noch ein Feld für den Ping-Status, den DNS Namen falls vorhanden und etwaige Bemerkungen. Über VBA wird die IP-Adresse ausgelesen und ein ping versucht. Ist dies erfolgreich, überprüft das Script den DNS Namen eigenhändig und schreibt ihn in eine Zelle. Falls keine DNS-Auflösung stattfindet, übernimmt er die IP-Adresse.
Private Sub update_Click()
Dim ws As Worksheet
Dim x As Integer
Dim i As Integer
Dim Result As String
Dim ip As String
Dim arrSplitStrings() As String
Dim excludeString As String
x = 10 ' helfer Variable um die Zelle für die IP Bereiche zu bestimmen
i = 2
t_bereich = Worksheets("Settings").Range("A1:A50").Find("IP-Bereich").Row
excludeString = Worksheets("Settings").Cells(9, 2).Value
arrSplitStrings = Split(excludeString, ";")
' Bereich clearen
Worksheets("Überblick").Range("B10:B200").Clear
'Gehe über jedes Arbeitsblatt
For Each ws In Worksheets
'Wenn dieses Arbeitsblatt nicht excluded werden soll, schreibe das Netz in die Übersicht
If Not IsInArray(ws.Name, arrSplitStrings) Then
Sheets("Überblick").Cells(x, 2) = ws.Name
' Suche den Namen des Netzwerkes in der Settings Arbeitsmappe
Do While Not IsEmpty(Worksheets("Settings").Cells(t_bereich, 2))
' Wenn das Netz gefunden wurde, schreibe es in die Zelle
If Worksheets("Settings").Cells(t_bereich, 2) = ws.Name Then
Sheets("Überblick").Cells(x, 3) = Worksheets("Settings").Cells(t_bereich, 3)
End If
' erhöhe t_bereich, damit die nächste Zelle überprüft wird
t_bereich = t_bereich + 1
Loop
'setze t_bereich wieder zurück
t_bereich = Worksheets("Settings").Range("A1:A50").Find("IP-Bereich").Row
'Solange es fortlaufende IPs gibt, führe ein Ping durch
Do While Not IsEmpty(ws.Cells(i, 2))
'Lese die IP aus
ip = ws.Cells(i, 2).Value
'Wenn ein Ping erfolgreich war, schreibe in die erste Zelle ein "S" für Success und färbe es grün
If Ping(ip) Then
ws.Cells(i, 1).Value = "S"
ws.Cells(i, 1).Interior.Color = RGB(50, 205, 50)
'Wenn in der Zelle für die Namensauflösung noch nichts steht, versuche den Namen aufzulösen
If IsEmpty(ws.Cells(i, 3)) Then
'Namensauflösung zu der IP Adresse
ws.Cells(i, 3) = HostName(ip)
End If
Else
'Wenn der Ping nicht erfolgreich war, schreibe "C" in die erste Zelle für Critical und färbe es rot
ws.Cells(i, 1).Value = "C"
ws.Cells(i, 1).Interior.Color = RGB(255, 120, 120)
End If
'erhöhe i um 1, damit die nächste IP gezogen wird
i = i + 1
Loop
'setze i wieder zurück
i = 2
'erhöhe x für den nächsten IP-Bereich
x = x + 1
End If
Next ws
'Wenn alles fertig, gebe eine MessageBox aus
MsgBox "Fertig!"
End Sub
In den obigen Code habe ich die Erklärung der wichtigsten Zeilen vorgenommen. Somit sollte dieser einfach zu verstehen sein. Sollte trotzdem etwas unklar sein, so fragt in den Kommentaren nach.
Weiter geht es mit der Ping Funktion. Relativ einfach ruft diese eine Shell auf und versucht die übergebene IP zu pingen. Je nach dem ob erfolgreich oder nicht, gibt es ein True oder False zurück. Durch den Parameter -n wird nur ein Paket verschickt. Mit Parameter -m haben wir eine Timeoutzeit von 1000ms und somit 1s definiert. Selbstverständlich dürfen die ICMP Pakete nicht von der Firewall verworfen werden. In dem Fall würde das Makro nicht korrekt funktionieren.
Function Ping(strcomputer)
Dim objshell, boolcode
Set objshell = CreateObject("wscript.shell")
boolcode = objshell.Run("ping -n 1 -w 1000 " & strcomputer, 0, True)
If boolcode = 0 Then
Ping = True
Else
Ping = False
End If
End Function
Ähnliches wie für den Ping gilt auch für den Hostname. Auch hier übergeben wir wieder die IP und es wird per Shell ein nslookup auf die IP gemacht. Erhalten wir den Namen so geben wir diesen zurück, ansonsten die IP.
Function HostName(ip$)
Dim s As String, a
s = CreateObject("Wscript.Shell").Exec("nslookup " & ip).StdOut.ReadAll
a = Split(s, vbCrLf)
If UBound(a) > 2 Then
If Not a(3) = "" Then
HostName = Right(a(3), Len(a(3)) - 9)
Else
HostName = ip
End If
End If
IsInArray ist eine Helferfunktion. Sie überprüft, ob der Wert im Array enthalten ist und gibt dementsprechend True oder False zurück.
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
Da ich aus Sicherheitsgründen keine .xlsm Dateien mit Macros hochladen kann, stelle ich die Datei als .xlsx bereit.
Die oben genannten Funktionen müssen dementsprechend eigenst in Excel eingebunden werden, damit die IP-Adressliste mit Excel funktioniert. Alles andere sollte dann direkt funktionieren. Je nach Anzahl der Netze im Arbeitsblatt kann ein vollständiger Scan lange dauern. Unter anderem aus diesem Grund habe ich ein „exclude“ Feld bei den Settings eingebaut.
