IP-Adressverwaltung mit IP-Scanner

Christoph Spielmann, Düsseldorf

In modernen Netzwerken wird heutzutage fast ausschließlich das TCP/IP-Protokoll zur übertragung von Daten eingesetzt. Eine Besonderheit dieses Protokolls ist, dass jedes Endgerät durch eine eindeutige IP-Adresse gekennzeichnet ist. Die im vorliegenden Beitrag vorgestellte Lösung hilft Ihnen bei der Verwaltung der IP-Adressen Ihres Netzwerks. Außerdem erfahren Sie hier Grundlegendes zum Thema TCP/IP und lernen, IP-Adressen per VBA auszulesen.

Die übertragung von Daten innerhalb eines Netzwerks wird als Schichtmodell abgebildet, das in der Theorie aus mehreren einzelnen Schichten besteht. Eine Schicht basiert jeweils auf den Diensten der darunter liegenden Schicht und fügt dieser weitere Funktionen hinzu.

Die unterste Schicht ist in der Regel das physikalische Protokoll, mit dem einzelne Datenbits durch Stromimpulse – oder beim W-LAN über elektromagnetische Wellen – übertragen werden. Beim weit verbreiteten Ethernet kommt zum Beispiel das CSMA/CD-Verfahren zum Einsatz (“Carrier Sense Multiple Access/Collision Detection”). Dieses Verfahren regelt zum Beispiel, wie Kollisionen vermieden werden, wenn mehrere PCs gleichzeitig über ein einzelnes Kabel senden möchten.

Aus diesem Verfahren stammt auch die bekannte MAC-Adresse, mit der jede Netzwerkkarte ausgestattet ist. Mit ihrer Hilfe kann ein Sender einen Empfänger eindeutig adressieren. Die MAC-Adressen werden hierbei bei der Produktion einer Ethernet-Karte zentral vergeben. So ist sichergestellt, dass jede weltweit produzierte Karte eine eindeutige Adresse besitzt.

Auf dem CSMA/CD-Protokoll können nun weitere unterschiedliche Protokolle aufsetzen. Dazu zählen beispielsweise das von Microsoft und IBM entwickelte NetBIOS-Protokoll, das IPX/SPX-Protokoll von Novell, aber auch das inzwischen mehr als 30 Jahre alte TCP/IP-Protokoll.

IP steht als Abkürzung für “Internet Protocol” und TCP als Abkürzung für “Transmission Control Protocol”. Das IP-Protokoll hat die Aufgabe, einzelne Datenpakete vom Sender zum Empfänger zu senden. Die Pakete sind hierbei sehr klein und umfassen in der Regel nur wenige KByte an Daten. Wenn größere Datenmengen aus einer Datei übertragen werden sollen, müssen mehrere IP-Pakete nacheinander versendet werden.

Insbesondere bei der übertragung von Daten über das Internet kann es vorkommen, dass einzelne Pakete unterschiedliche Wege nehmen und sich so die Reihenfolge der Pakete beim Empfänger ändert. Das TCP-Protokoll sorgt nun dafür, dass diese wieder in der richtigen Reihenfolge zusammengesetzt werden. Sollten hierbei Pakete verloren gehen oder beschädigt werden, fordert das TCP-Protokoll diese neu beim Sender an, sodass eine übertragene Datei wieder hergestellt werden kann.

Insbesondere bei Live-Multimedia-übertragungen kommt an Stelle des TCP-Protokolls ein weiteres Protokoll namens UDP zum Einsatz. Die Besonderheit ist hier zum Beispiel, dass fehlende Pakete nicht neu angefordert werden. Wenn beispielsweise eines von 24 Bildern pro Sekunde einen Fehler aufweist, macht es keinen Sinn, dieses Bild einige Sekunden später noch einmal in einer korrekten Form zu empfangen. Statt dessen wird das defekte Bild einfach ausgelassen, was dem Betrachter kaum auffällt.

Grundlage für das Funktionieren des IP-Protokolls ist, dass Sender und Empfänger eine eindeutige Adresse besitzen. Dies ist die IP-Adresse. Eine IP-Adresse ist nichts anderes als eine ganzzahlige Nummer, die innerhalb eines Netzwerkes eindeutig sein muss.

Da diese Nummer einen großen Wertebereich hat und damit schwer zu merken ist, werden IP-Adressen in der Regel in vier Teilen angegeben, die jeweils durch einen Punkt getrennt sind, wie zum Beispiel 192.168.1.7.

Die einzelnen Teile der IP-Adresse dürfen einen Wertebereich von 0 bis 255 aufweisen, sodass 0.0.0.0 die kleinste und 255.255.255.255 die größte IP-Adresse ist.

Wenn man bedenkt, dass in Zukunft vom Fernseher über das Handy bis zum Auto jedes elektrische Gerät eine IP-Adresse haben soll, wird deutlich, dass der Adressbereich bald aufgebraucht sein wird. Hier wird das neue IP-Protokoll in der Version 6 Abhilfe schaffen, das einen wesentlich größeren Adressbereich anbietet. Jeder Quadratmeter der Erdoberfläche kann hier mit mehr als 1000 IP-Adressen ausgestattet werden, was für einige Zeit ausreichen dürfte.

Jeder IP-Adresse ist üblicherweise ein Name zugewiesen, der sich einfacher merken lässt. Diese Zuweisung wird von einem so genannten “Domain Name Server” verwaltet. Dieser kann zu jedem Namen eine IP-Adresse zurückgeben (DNS-Lookup). Der umgekehrte Weg ist ebenfalls möglich (Reverse DNS-Lookup). Schließlich ist es einfacher, über den Link http://www.microsoft.de auf die Web-Seite von Microsoft zu gelangen, als den Link http://212.184.80.190 zu verwenden.

Die in dieser Musterlösung vorgestellte Verwaltung von IP-Adressen basiert auf einer einzelnen Tabelle namens tblIPAdressen. Die Tabelle hat den folgenden Aufbau:

Feldname

Beschreibung

IPAdresse

Zahl des Typs Long Integer

IPString

IP-Adresse als Zeichenkette

Name

DNS-Name

Beschreibung

Beschreibung zur Adresse

AngelegtAm

Anlage des Datensatzes

LetztePrüfungAm

Letzte Prüfung des Datensatzes

IstErreichbar

Ja/Nein-Feld, das die Erreichbarkeit des Endgeräts angibt

Tab. 1: Die Felder der Tabelle tblIPAdressen

Das Feld IPAdresse ist der Primärschlüssel der Tabelle. Hier werden die IP-Adressen als Zahl abgelegt. Das Feld IPString dient der besseren Lesbarkeit der Adresse, da diese hier in der gewohnten Art und Weise mit dem Punkt als Trennzeichen angegeben ist. Das Feld Name nimmt den DNS-Namen des Geräts auf, sofern dieser verfügbar ist. Bei Bedarf kann das Gerät mit einer benutzerdefinierten Beschreibung kommentiert werden.

Die beiden folgenden Datumsfelder nehmen das Anlagedatum des Datensatzes sowie das Datum der letzten Prüfung durch den IP-Scanner auf. Das letzte Ja/Nein-Feld gibt schließlich an, ob das Gerät erreichbar war.

Dies ist beispielsweise dann erforderlich, wenn der DNS zwar zu einer IP-Adresse einen Namen liefert, das Gerät jedoch momentan ausgeschaltet ist.

Public Property Get Adresse() As Long
    Adresse = m_Adresse
End Property
Public Property Let Adresse(Value As Long)
    m_Adresse = Value
    m_BatFilename = "C:\ping" + CStr(m_Adresse) + ".bat"
    m_ResultFilename = "C:\pingresult" + CStr(m_Adresse) + ".txt"
End Property

Quellcode 1

Public Sub Scan(DoDBUpdate As Boolean, Async As Boolean)
    Dim IPString As String
    IPString = modIPTools.IPLongToString(m_Adresse)
    If Dir(m_ResultFilename) <> "" Then Kill m_ResultFilename
    If Dir(m_BatFilename) <> "" Then Kill m_BatFilename
    Dim ExitCode As Long
    Dim FreeFileID As Integer
    Dim ReadLine As String
    Dim Command As String
    Command = "ping.exe -a -n 3 " + IPString + " >" + m_ResultFilename
    FreeFileID = FreeFile
    Open m_BatFilename For Output As #FreeFileID
        Print #FreeFileID, Command
    Close #1
    m_InstanceID = Shell(m_BatFilename, vbHide)
    m_ProcessID = OpenProcess(PROCESS_QUERY_INFORMATION, False, m_InstanceID)
    If Async = False Then
        Do
            Call GetExitCodeProcess(m_ProcessID, ExitCode)
            DoEvents
        Loop While ExitCode = STATUS_PENDING
        If Dir(m_ResultFilename) <> "" Then
            FreeFileID = FreeFile
            Open m_ResultFilename For Input As #FreeFileID
                Do While Not EOF(FreeFileID)
                     Line Input #FreeFileID, ReadLine
                     m_ResultText = m_ResultText + ReadLine + vbCrLf
                Loop
            Close #1
            If Dir(m_ResultFilename) <> "" Then Kill m_ResultFilename
            If Dir(m_BatFilename) <> "" Then Kill m_BatFilename
            If DoDBUpdate Then
                UpdateDatabase
            End If
        End If
    End If
End Sub

Quellcode 2

Das Füllen der vorgestellten Tabelle soll möglichst automatisch erfolgen. Idealerweise soll die Tabelle nach Abschluss des Scan-Vorgangs eine übersicht über alle im lokalen Netzwerk angeschlossenen Geräte liefern.

Um Informationen über die Erreichbarkeit eines Netzwerkgeräts zu erhalten, eignet sich der DOS-Befehl “Ping”. Dieser sendet über ein spezielles IP-Protokoll namens ICMP (Internet Control Message Protocol) eine Anfrage an ein Gerät mit der Bitte, diese zu beantworten.

Da es sich um einen DOS-Befehl handelt, kann dieser von Access aus prinzipiell mit Hilfe der Shell-Funktion ausgeführt werden. Der Nachteil ist jedoch, dass das Ergebnis der Funktion nicht abgefragt werden kann. Der IP-Scanner bedient sich daher einiger Tricks, um an das Ergebnis zu gelangen.

Den kompletten Quellcode des Scanners finden Sie in dem Klassenmodul clsScanner der Beispieldatenbank zu dieser Musterlösung.

Hinweis

Die im vorliegenden Beitrag vorgestellte Musterlösung finden Sie auf der Heft-CD unter dem Dateinamen IPDatabase.mdb (nur für Access 2000 und höher).

Damit die Klasse weiß, welche IP-Adresse sie untersuchen soll, besitzt sie eine private Variable namens m_Adresse:

Private m_Adresse As Long

Um die Variable von außen zugänglich zu machen, stellt die Klasse zwei entsprechende Property-Prozedure zum lesenden und schreibenden Zugriff zur Verfügung (s. Quellcode 1).

Beim schreibenden Zugriff werden unter anderem die beiden Variablen m_ResultFilename und m_BatFilename initialisiert. Die Bedeutung lernen Sie später noch kennen. Die Kernfunktion der Klasse trägt den Namen Scan (s. Quellcode 2).

Zunächst wird die in der Variablen m_Adresse gespeicherte IP-Adresse in eine Zeichenkette umgewandelt, sodass diese später mit dem DOS-Befehl Ping eingesetzt werden kann. Als weitere Vorbereitung werden die beiden temporären Dateien gelöscht, falls diese bereits vorhanden sind.

Als Nächstes wird die komplette Anweisung zur Ausführung der Ping-Anweisung erstellt und das Ergebnis in der Variablen Command abgelegt.

Der komplette Befehl besteht hierbei aus dem Teil ping.exe, einigen Parametern, die die Häufigkeit der Ping-Versuche steuern und die Ausgabe des DNS-namens bewirken, sowie einer Umleitung des Ergebnisses mittels “>”-Operator in den in der Variablen m_ResultFilename angegebenen Dateinamen. Damit mehrere Scanner gleichzeitig arbeiten können, enthält der Dateiname zusätzlich auch die IP-Adresse.

Der fertige Befehl kann nun leider nicht direkt mit der Shell-Anweisung ausgeführt werden, da hierbei aus unerklärlichen Gründen das Ergebnis nicht in die Datei m_ResultFilename geschrieben wird. Als Workaround wird daher zunächst unter dem in der Variablen m_BatFilename abgelegten Namen eine Batch-Datei angelegt, mit dem Befehl gefüllt, gespeichert und schließlich ausgeführt.

Abrufen des Ping-Ergebnisses

Nach dem Start der Batch-Datei mittels Shell-Funktion setzt Access die Ausführung des Programms fort, obwohl die Ping-Anweisung noch nicht beendet und damit das Ergebnis noch nicht vorhanden ist. Diese Art der Ausführung wird auch als asynchrone Ausführung bezeichnet.

Der nachfolgende Anweisungsblock ermittelt daher die interne Prozess-ID der Batch-Datei mit Hilfe von API-Funktionen. Mittels einer Do Loop-Schleife wird nachher regelmäßig geprüft, ob die Ping-Anweisung ihre Arbeit abgeschlossen hat.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar