VB 5/6-Tipp 0261: MAC der Netzwerkkarte(n) auslesen
von ActiveVB
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: | Verwendete API-Aufrufe: RtlMoveMemory (CopyMemory), RtlMoveMemory (CopyMemory_ByRef), Netbios | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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 ?