Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0261: MAC der Netzwerkkarte(n) auslesen

 von 

Beschreibung 

Die MAC-Adresse eines Netzwerkadapters/einer Netzwerkkarte ist i.d.R eine eindeutige unveränderbare ID und wird daher auch gerne für einen Kopierschutz genutzt. Dieser Tipp zeigt das Auslesen der MAC-Adressen aller angeschlossenen Netzwerkadapter, sofern das Netzwerkkabel steckt. Zudem ist es auch möglich die MAC-Adresse(n) eines anderen Rechners auszulesen.
Tipp 607 zeigt, wie man die MAC-Adresse(n) per WMI auslesen kann.

Update am 06. März 2005 von Kai Liebenau:
Der Tipp wurde generalüberholt.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

RtlMoveMemory (CopyMemory), RtlMoveMemory (CopyMemory_ByRef), Netbios

Download:

Download des Beispielprojektes [4,41 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Textfeld "txtComputername"
' Steuerelement: Optionsfeld-Steuerelement "optOtherComputer"
' Steuerelement: Optionsfeld-Steuerelement "optThisComputer"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Listen-Steuerelement "List1"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Private Sub Command1_Click()
    Dim bLanAdapter() As Byte
    Dim i As Long
    Dim numAdapter As Long
    Dim macaddr As String
    
    Me.MousePointer = vbHourglass
    
    ' Listbox leeren
    List1.Clear
    
    'Alle Adapter auslesen
    numAdapter = modNetBios.NB_EnumLanAdapter(bLanAdapter)
        
    'wurde mindestens ein aktiver Adapter gefunden
    If numAdapter > 0 Then
        'Für jeden Adapter die MAC-Adresse auslesen
        For i = 1 To numAdapter
            'diesen Adapter initalisieren
            Call modNetBios.NB_ResetAdapter(bLanAdapter(i), 20, 30)
            
            If optThisComputer.Value = True Then
                ' MAC-Adresse dieses Adapters auslesen
                List1.AddItem modNetBios.NB_GetMACAddress(bLanAdapter(i))
            Else
                ' Probieren die MAC-Adresse über diesen Adapter zu ermitteln
                macaddr = modNetBios.NB_GetMACAddress(bLanAdapter(i), txtComputername.Text)
                ' Wenn eine MAC-Adresse über diesen Adapter ermittelt wurde,
                ' dann die MAC-Adresse anzeigen
                If Len(macaddr) > 0 Then List1.AddItem macaddr
            End If
        Next i
    Else
        List1.AddItem "Keine Netzwerkadapter gefunden!"
    End If
    
    Me.MousePointer = vbDefault
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'------ Anfang Modul "modNetBios" alias modNetBios.bas ------
'Modul: modNetBios
Option Explicit

Private Declare Function Netbios Lib "netapi32.dll" _
        (pncb As NCB) As Byte
        
Private Declare Sub CopyMemory Lib "kernel32" Alias _
        "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource _
        As Long, ByVal cbCopy As Long)

Private Declare Sub CopyMemory_ByRef Lib "kernel32" Alias _
        "RtlMoveMemory" (hpvDest As Any, hpvSource _
        As Any, ByVal cbCopy As Long)

Private Const NCBENUM As Byte = &H37
Private Const NCBFINDNAME As Byte = &H78
Private Const NCBDELNAME As Byte = &H31
Private Const NCBADDGRNAME As Byte = &H36
Private Const NCBADDNAME As Byte = &H30
Private Const NCBASTAT As Byte = &H33
Private Const NCBNAMSZ As Byte = 16
Private Const NCBRESET As Byte = &H32

Public Const NRC_ACTSES As Long = &HF&
Public Const NRC_BADDR As Long = &H7
Public Const NRC_BRIDGE As Long = &H23
Public Const NRC_BUFLEN As Long = &H1
Public Const NRC_CANCEL As Long = &H26
Public Const NRC_CANOCCR As Long = &H24
Public Const NRC_CMDCAN As Long = &HB
Public Const NRC_CMDTMO As Long = &H5
Public Const NRC_DUPENV As Long = &H30
Public Const NRC_DUPNAME As Long = &HD
Public Const NRC_ENVNOTDEF As Long = &H34
Public Const NRC_GOODRET As Long = &H0
Public Const NRC_IFBUSY As Long = &H21
Public Const NRC_ILLCMD As Long = &H3
Public Const NRC_ILLNN As Long = &H13
Public Const NRC_INCOMP As Long = &H6
Public Const NRC_INUSE As Long = &H16
Public Const NRC_INVADDRESS As Long = &H39
Public Const NRC_INVDDID As Long = &H3B
Public Const NRC_LOCKFAIL As Long = &H3C
Public Const NRC_LOCTFUL As Long = &H11
Public Const NRC_MAXAPPS As Long = &H36
Public Const NRC_NAMCONF As Long = &H19
Public Const NRC_NAMERR As Long = &H17
Public Const NRC_NAMTFUL As Long = &HE
Public Const NRC_NOCALL As Long = &H14
Public Const NRC_NORES As Long = &H9
Public Const NRC_NORESOURCES As Long = &H38
Public Const NRC_NOSAPS As Long = &H37
Public Const NRC_NOWILD As Long = &H15
Public Const NRC_OPENERR As Long = &H3F
Public Const NRC_OSRESNOTAV As Long = &H35
Public Const NRC_PENDING As Long = &HFF&
Public Const NRC_REMTFUL As Long = &H12
Public Const NRC_SABORT As Long = &H18
Public Const NRC_SCLOSED As Long = &HA
Public Const NRC_SNUMOUT As Long = &H8
Public Const NRC_SYSTEM As Long = &H40
Public Const NRC_TOOMANY As Long = &H22

Private Type NCB
  ncb_Command As Byte
  ncb_RetCode As Byte
  ncb_LSN As Byte
  ncb_Num As Byte
  ncb_pBuffer As Long
  ncb_Length As Integer
  ncb_CallName As String * NCBNAMSZ
  ncb_Name As String * NCBNAMSZ
  ncb_RTO As Byte
  ncb_STO As Byte
  ncb_Post As Long
  ncb_Lana_Num As Byte
  ncb_Cmd_Cplt As Byte
  ncb_Reserve(9) As Byte
  ncb_Event As Long
End Type

Private Type ADAPTER_STATUS
  adapter_address(5) As Byte
  rev_major As Byte
  reserved0 As Byte
  adapter_type As Byte
  rev_minor As Byte
  duration As Integer
  frmr_recv As Integer
  frmr_xmit As Integer
  iframe_recv_err As Integer
  xmit_aborts As Integer
  xmit_success As Long
  recv_success As Long
  iframe_xmit_err As Integer
  recv_buff_unavail As Integer
  t1_timeouts As Integer
  ti_timeouts As Integer
  Reserved1 As Long
  free_ncbs As Integer
  max_cfg_ncbs As Integer
  max_ncbs As Integer
  xmit_buf_unavail As Integer
  max_dgram_size As Integer
  pending_sess As Integer
  max_cfg_sess As Integer
  max_sess As Integer
  max_sess_pkt_size As Integer
  name_count As Integer
End Type

Private Type NAME_BUFFER
  Name As String * NCBNAMSZ
  name_num As Integer
  name_flags As Integer
End Type

Private Type ASTAT
  adapt As ADAPTER_STATUS
  NameBuff(30) As NAME_BUFFER
End Type

Private Type ENUM_LANA
    bCount As Byte
    bLana(300) As Byte
End Type

Public Function NB_EnumLanAdapter(bLanArray() As Byte) As Long
    Dim myNcb As NCB
    Dim bRetEnum As ENUM_LANA
    
    'NetBios Command Enum setzen
    myNcb.ncb_Command = NCBENUM
    
    'Bufferpointer eintragen
    myNcb.ncb_pBuffer = VarPtr(bRetEnum)
    
    'Größe des Buffers angeben
    myNcb.ncb_Length = Len(bRetEnum)
    
    'Alle aktiven Netzwerkkarten enumerieren
    If Netbios(myNcb) = NRC_GOODRET Then
    
        'Anzahl der aktiven Netzwerkkarten auslesen
        If bRetEnum.bCount Then
            NB_EnumLanAdapter = CLng(bRetEnum.bCount)
            
            'Nur auslesen, wenn mindestens 1 Netzwerkkarte gefunden wurde
            'Return Array anpassen
            ReDim bLanArray(1 To bRetEnum.bCount)
            
            'Daten ins Array kopieren
            CopyMemory_ByRef bLanArray(1), bRetEnum.bLana(0), bRetEnum.bCount
        End If
    End If
End Function

Public Function NB_ResetAdapter(lLanNumber As Byte, lSessions As Long, lMaxNames As Long) As Long
    Dim myNcb As NCB
    
    'Welche Netzwerkkarte soll resetet werden
    myNcb.ncb_Lana_Num = lLanNumber
    
    'NetBios Command setzen
    myNcb.ncb_Command = NCBRESET
    myNcb.ncb_LSN = 0

    'Maximale Anzahl an Sessions seztzen
    Mid$(myNcb.ncb_CallName, 1, 1) = Chr$(lSessions)
    
    'Maximale Anzahl an Namen setzen
    Mid$(myNcb.ncb_CallName, 3, 1) = Chr$(lMaxNames)
    
    'Netzwerkkarte reseten
    If Netbios(myNcb) = NRC_GOODRET Then NB_ResetAdapter = 1
End Function

Public Function NB_GetMACAddress(lLanNumber As Byte, Optional Server As String = "*") As String
    Dim myNcb As NCB
    Dim bRet As Byte
    Dim myASTAT As ASTAT
    
    'NetBios Command setzen
    myNcb.ncb_Command = NCBASTAT
    
    'Welche Netzwerkkarte soll benutzt werden
    myNcb.ncb_Lana_Num = lLanNumber
    
    'Server setzen, dies kann auch ein RemoteHost sein!
    myNcb.ncb_CallName = Server
    
    'Größe des Speichers setzen
    myNcb.ncb_Length = Len(myASTAT)
    
    'Buffer eintragen
    myNcb.ncb_pBuffer = VarPtr(myASTAT) 'pASTAT
    
    'Karte auslesen
    If Netbios(myNcb) = NRC_GOODRET Then
    
        'Daten in die neue
        NB_GetMACAddress = _
                   HexEx(myASTAT.adapt.adapter_address(0)) & "-" & _
                   HexEx(myASTAT.adapt.adapter_address(1)) & "-" & _
                   HexEx(myASTAT.adapt.adapter_address(2)) & "-" & _
                   HexEx(myASTAT.adapt.adapter_address(3)) & "-" & _
                   HexEx(myASTAT.adapt.adapter_address(4)) & "-" & _
                   HexEx(myASTAT.adapt.adapter_address(5))
    End If
End Function

Private Function HexEx(ByVal lNumber As Long) As String
    HexEx = Hex(lNumber)
    If Len(HexEx) = 1 Then HexEx = "0" & HexEx
End Function
'------- Ende Modul "modNetBios" alias modNetBios.bas -------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 39 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Körschgen, Michael am 27.04.2010 um 20:00

Guten Tag,

vielen Dank für Ihren Code. Ich suche jedoch (für einen "Kopierschutz") eine Möglichkeit, die MAC-Adresse eines Routers auszulesen (Das klappt irgendwie nicht). Diese soll dann fest in der zu schützenden Datei (Excel-Mappe) versteckt hinterlegt werden. Bei jedem Start soll eine VB-Routine die MAC-Adresse des Routers abfragen und mit der hinterlegten Adresse vergleichen: identisch - ok, nicht identisch - nix geht mehr ohne den Support. Daher meine Frage: geht sowas auch mit VB?
Vielen Dank und viele Grüße
M. Körschgen

Kommentar von Michael am 04.01.2007 um 07:49

@ H3ct0r:
Was sollen denn solche Killer-Phrasen???
Die MAC-Adresse ist einmalig in der jeweiligen Hardware vergeben und nicht änderbar. Richtig ist jedoch, dass man eine MAC-Adresse "vorgaukeln" kann. Das Zauberwort hierzu ist "MAC-spoofing". Damit kann ich z.B. in einem WLAN-Router das MAC-Filter umgehen, wenn ich eine gültige MAC-Adresse in dem WLAN ausspähe. Wer mehr dazu lesen möchte kann es ja mal bei Google eingeben.

Kommentar von H3ct0r am 04.01.2007 um 00:33

Pff, pfeifen nattürlich sind Mac adds. zu ändern.

Kommentar von Kalle am 12.05.2006 um 18:25

Bei mir funktioniert alles. Habe Win XP eigene MAC wurde ausgelesen und auch die von anderen PC' im Netzwerk.

Habe wie gesagt Win XP SP 1 und VB 6

Kommentar von Frank am 02.11.2005 um 21:15

Kommentar:
Auslesen der eigenen MAC-Adresse funktioniert, die Rechner der Kinder wurden wohl nicht gefunden!!
Gruß an alle
Frank

Kommentar von Michael Graef am 03.07.2005 um 10:31

Unter XP funktioniert das wohl nicht, weil XP standardmässig kein NetBEUI/NetBIOS-Protokoll mehr hat.
NetBEUI für XP unter:
http://support.microsoft.com/default.aspx?scid=kb;en-us;301041&sd=tech
Nachdem das installier ist, könnte das auch unter XP funktionieren.

Try it out...

Gruß
Michael

Kommentar von MB_MICHAEL am 12.01.2005 um 10:19

Bekomme leider auch nur 00-00-00-00-00 zurück.

Grüße
Michael

Kommentar von Mmüller am 11.01.2005 um 17:41

Man kann die MacAdresse in Win98 aber auch ohne diesen Firlefanz auslesen. Das geht nämlich sehr komfortabel mit Bordmitteln. Man öffene die Eingabeaufforderung (command) und tippe winipcfg ein. Alles andere ist selbsterklärend.

Bye
Mmü

Kommentar von Johannes Roth am 17.10.2004 um 16:17

Um hier mal aufzuräumen:

1.) Nein, MAC Adressen sind nicht änderbar! Auch nicht über die Registry - sie sind eindeutig (hoffentlich)!
2.) Unter Windows 2000 hat der Code - bei mir - funktioniert.
3.) Der Befehl getmac ist nur in WinXP Prof.

Kommentar von Harald am 11.10.2004 um 15:22

Bei WIN XP Home/Pro mit einer zusätzliche eingebaute Netzwerkkarte funktioniert dieser Tipp „0261“ MAC der Netzkartenadresse auslesen

Bei WIN XP Home/Pro bekomme ich nur 00 00 00 00 00 00 als Antwort wenn es sich um eine ON BOARD Netzwerkkarte handelt

Kommentar von ZoToS am 25.08.2004 um 11:56

Im Tipp 0607 soll es angeblich auch unter XP funzen!
http://www.activevb.de/tipps/vb6tipps/tipp0607.html

Kommentar von Gerd am 16.08.2004 um 14:17

Vielleicht funktioniert eine der beiden Varianten von http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_21033530.html auch unter XP.

Kommentar von Fabian am 16.08.2004 um 12:47

Befehl getmac in der eingabeaufforderung funktioniert bei mir unter XP nicht

Kommentar von Fabian am 16.08.2004 um 12:45

Bei mir funktioniert des mit vb6 unter winxp au net
bekomm nur 00-00-00-00-00-00 zurück
auch mit anderen codes

Kommentar von Thorsten am 30.04.2004 um 21:27

Also unter XP gehts auch so:

Die Eingabeaufforderung entweder unter Programme\Zubehör
öffnen oder Ausführen: cmd eingeben.
Dann getmac eingeben und fertig.

Thorsten

Kommentar von maiks am 30.04.2004 um 15:54

Ich habe dieses programm unter xp professioanal ausprobiert
hat aber nicht funktoniert ,wenn jemand eine loesung hat bitte mailen

danke

Kommentar von Marc ETIENNE am 23.04.2004 um 16:33

Hallo,

der Beispiel-Code hat unter XP Professional nicht funktioniert und zwar bekomme ich bei beiden NEtBios Aufrufe (sowohl für NCBRESET als auch NCBASTAT) den Fehler 35=23Hex zurück der "ncb_lana_num field invalid" bedeutet. Die NCBENUM-Funktion gibt keinen Fehler zurück und sendet mir für alle LANA's 0 zurück.
Irgendwelche Ideen?

Besten Dank.

Marc

Kommentar von Oliver am 03.05.2003 um 15:00

>Unter Win2000/VB6 muß die LANA-Nummer
>mit NCBENUM zuerst ermittelt werden.
>siehe Beispiel auf
>http://www.scottandmichelle.net/scott/
>code/index2.mv?codenum=063

hmm, das bringt einen schon ein bisschen weiter, allerdings findet das NCBENUM nur die LAN-Karten, die gerade aktiv (Netzwerkkabel angeschlossen) sind. Wie bekomme ich aber ALLE MAC-Adressen raus, auch die von denen, die nicht aktiv sind??? Hab ein Notebook mit "Festnetz"-Ethernet-Karte und mit WLAN-Karte und die durch das Beispiel angezeigte MAC-Adresse wechselt je nachdem, ob die WLAN-Karte eingesteckt ist, oder nicht...

Kommentar von Gerd am 08.04.2003 um 10:24

Unter Win2000/VB6 muß die LANA-Nummer mit NCBENUM zuerst ermittelt werden.
siehe Beispiel auf http://www.scottandmichelle.net/scott/code/index2.mv?codenum=063

Kommentar von Mark am 28.03.2003 um 13:44

Also bei mir WIN2000/VB6 funktioniert das Prog nicht - aber wurde ja schon geschrieben.

Ohne mich jetzt tiefer mit dem Code auseiandergesetzt zu haben - von wo wird die MACadresse ausgelesen?
VomIP-port .. oder direkt von der hardware ?

Ersteres ist sehr simpel durch eine eienfach eAenderung in der Registry zu manipulieren

Kommentar von Dr.Hyde am 06.03.2003 um 00:50

Die MAC Adresse der LAN Karte wird bei mir unter XP korrekt angezeigt ! Aber wie kann ich z.B. die MAC Adresse vom WAN(PPP/SLIP)Interface auslesen ? Mit dem Tool View Nic (C++ Builder) geht das.

Kommentar von Dirk am 04.03.2003 um 09:22

Hat jemand das Problem schon unter XP oder 2000 mit VB6 in Angriff genommen und gelöst?
Bei mir tut das nicht, da nur 00-00-... zurückkommt.

Danke für Tipps

Kommentar von am 13.02.2003 um 19:10

Kommentar von Georgios am 23.12.2002 um 19:35

Wie kann ich unter win 98 die mac Adresse ändern?

Kommentar von Pascal am 14.11.2002 um 13:40

Die Mac Adresse kann man sich mit "ipconfig -all" anzeigen lassen. Steht dann unter "Physikalischer Adresse

Kommentar von Barnew am 12.11.2002 um 12:29

wo steht denn nun meine MAC-Adresse?
Wäre dankbar für Hilfe !!
Gruß horbar

Kommentar von Kill][Switch am 02.11.2002 um 22:58

Es muss doch auch möglich sein die MAC Adresse vom Remote auszulesen...oder?
...also man connected zu einer IP/Port und kann dann die MAC von dieser IP auslesen. Muss doch gehen!

Kommentar von Franz Goppold am 29.07.2002 um 15:49

Hi Ich hab ein C++ Programm geschrieben das die MAC Adr. ausgibt! Aber unter Win2k funktioniert es nicht! Kann mir da jemand helfen?
Hier der Code :
#include
#include
#include
#include
using namespace std;
int main()
{
cout

Kommentar von Maniacsempire am 05.07.2002 um 08:27

Was passiert, wenn gar keine Netzwerkkarte vorhanden ist?
Bekomme ich dann auch diese hier schon angesprochenen 00-00..?

Kommentar von Faxi am 18.06.2002 um 12:31

Unter WinXP bekomme ich nur die ominösen Nullen (00-00-00

Kommentar von Jürgen am 04.06.2002 um 21:18

MAC Adressen können nicht geändert werden und sind bei jeder Netzwerkkarte eindeutig (einmalig).

Kommentar von Marion am 21.05.2002 um 19:46

Hallo,
Ist es möglich bei einer Netzwerkkarte (PCMCIA)die MAC-Adresse zu ändern? Ich habe Windows98

Kommentar von nitker am 13.05.2002 um 19:05

kann man unter winnt4.0 die MAC-Adresse der PCMCIA-Netzwerkkarte ändern?

Kommentar von egon olsen am 09.04.2002 um 13:35

Funktioniert bei mir nur unter Win 95/98/Me. Unter NT bekomme ich nur 00-00-00-00-00-00.
WARUM ???

Kommentar von Arpad Siladi am 03.04.2002 um 18:19

Hallo Leute!
Wie kann ich eigentlich bei einer Netzwerkkarte (PCMCIA)die MAC-Adresse ändern? Ist dies überhaupt möglich?

Kommentar von Britta Caradin am 29.03.2002 um 08:15

warum bekomme ich nur nullen (00-00-00-...) als macadresse? benutze win2k mit mehreren netzwerkkarten.

Kommentar von Kai am 14.11.2001 um 09:48

Mann kann über ein Proggi doch bestimmt auch die IP ändern, oder ? Falls ja schreibt mir bitte wie. Danke schonmal im voraus.

Kommentar von Andre am 05.05.2001 um 22:38

Wie kann ich die MAC Adresse zu einer beliebigen IP auslesen ?

Kommentar von Stefan Boroch am 06.03.2001 um 23:17

Kann man eine MAC Adresse auch ermitteln wenn eine Netzwerkkarte vorhanden ist aber kein Kabel angeschlossen ist ?