Re: Mac-Adresse
Verfasst: 01.12.2014 11:09
Das verlinkte Windows-Beispiel von RSBasic ermittlet die Hardware GUID, aber nicht die gewünschte MAC-Adresse der lokalen Ethernet-Netzwerkschnittstelle!
Ein ganz einfaches Windows-Beispiel (getestet unter Windows XP SP3 und Windows 7 x86 SP1) verwendet den GetMAC-Befehl:
Das von Vera verlinkte Beispiel mit Einsatz des arp-Befehls funktioniert nicht zur Ermittlung lokaler MAC-Adressen!
Daher zeige ich hier ein Beispiel für MacOS (erfolgreich getestet auf MacOS X 10.6.8 SnowLeopard mit PB 5.31 x86 und x64 im ASCII- und Unicode-Modus), das die MAC-Adressen aller lokalen Ethernet-Schnittstellen anzeigt. Es werden sowohl aktive als auch inaktive Ethernet-Schnittstellen angezeigt (z.B. die aktive WLAN-Schnittstelle und die inaktive kabelgebundene Schnittstelle). Es ist auch möglich, dieses Beispiel so zu erweitern, dass nur aktive Ethernet-Schnittstellen angezeigt werden. Da diese Erweiterung allerdings recht kompliziert ist, habe ich sie aus Gründen der Übersichtlichkeit weggelassen. Bei Interesse kann ich das erweiterte Beispiel gerne ebenfalls zeigen.
Und hier habe ich das obige Mac-Beispiel an Linux angepaßt (erfolgreich getestet unter Ubuntu 14.04 x64 mit KDE, Fedora 20 x86 mit Gnome 3 und Ubuntu 14.04 x86 mit Unity jeweils im ASCII- und Unicode-Modus):
Ein ganz einfaches Windows-Beispiel (getestet unter Windows XP SP3 und Windows 7 x86 SP1) verwendet den GetMAC-Befehl:
Code: Alles auswählen
EnableExplicit
Define i.I
Define MACEntry.S
Define MACInfo.S
Define Output.S
Define ProgramID.I
ProgramID = RunProgram("GetMAC", "/FO CSV", "", #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide)
If ProgramID
While ProgramRunning(ProgramID)
If AvailableProgramOutput(ProgramID)
Output + ReadProgramString(ProgramID) + #CR$
EndIf
Wend
CloseProgram(ProgramID)
For i = 1 To CountString(Output, #CR$)
MACEntry = ReplaceString(StringField(StringField(Output, i, #CR$), 1, ","), #DQUOTE$, "")
If MACEntry <> "" And Left(MACEntry, 1) <> "P"
MACInfo + MACEntry + #CRLF$
EndIf
Next i
MessageRequester("MAC-Adressen", MACInfo)
EndIf
Daher zeige ich hier ein Beispiel für MacOS (erfolgreich getestet auf MacOS X 10.6.8 SnowLeopard mit PB 5.31 x86 und x64 im ASCII- und Unicode-Modus), das die MAC-Adressen aller lokalen Ethernet-Schnittstellen anzeigt. Es werden sowohl aktive als auch inaktive Ethernet-Schnittstellen angezeigt (z.B. die aktive WLAN-Schnittstelle und die inaktive kabelgebundene Schnittstelle). Es ist auch möglich, dieses Beispiel so zu erweitern, dass nur aktive Ethernet-Schnittstellen angezeigt werden. Da diese Erweiterung allerdings recht kompliziert ist, habe ich sie aus Gründen der Übersichtlichkeit weggelassen. Bei Interesse kann ich das erweiterte Beispiel gerne ebenfalls zeigen.
Code: Alles auswählen
EnableExplicit
#AF_LINK = 18 ; Address family on BSD and MacOS X
#IFT_ETHER = 6 ; Ethernet CSMACD
#SOCK_DGRAM = 2
ImportC ""
freeifaddrs(*InterfaceList)
getifaddrs(*InterfaceList)
EndImport
Structure ifaddrs
*ifa_next ; Next item in list
*ifa_name ; Name of interface
ifa_flags.I ; Flags from SIOCGIFFLAGS
*ifa_addr ; Address of interface
*ifa_netmask ; Netmask of interface
StructureUnion
*ifu_broadaddr ; Broadcast address of interface
*ifu_dstaddr ; Point-to-point destination address
EndStructureUnion
*ifa_data ; Address-specific data
EndStructure
Structure sockaddr_dl
sdl_len.A ; Total length
sdl_family.A ; Address family = AF_LINK
sdl_index.U ; Index of interface
sdl_type.A ; Interface type
sdl_nlen.A ; Interface name length
sdl_alen.A ; Link level address length
sdl_slen.A ; Link layer selector length
sdl_data.A[12] ; Interface name and link level address
sdl_rcf.U ; Source routing protocol
sdl_route.U[16] ; Source routing information
EndStructure
Procedure.S GetMACAddress(*SocketAddress.sockaddr_dl)
Protected i.I
Protected MACAddress.S
If *SocketAddress\sdl_alen > 0
For i = 0 To *SocketAddress\sdl_alen - 1
MACAddress + RSet(Hex(*SocketAddress\sdl_data[i +
*SocketAddress\sdl_nlen], #PB_Byte), 2, "0")
If i < *SocketAddress\sdl_alen - 1
MACAddress + ":"
EndIf
Next i
EndIf
ProcedureReturn MACAddress
EndProcedure
Procedure.S GetMACAddressesOfEthernetInterfaces()
Protected *InterfaceList
Protected *ListPointer.ifaddrs
Protected MACList.S
Protected *SocketAddress.sockaddr_dl
If getifaddrs(@*InterfaceList) = 0
*ListPointer = *InterfaceList
Repeat
*SocketAddress = *ListPointer\ifa_addr
If *SocketAddress
If *SocketAddress\sdl_family = #AF_LINK And
*SocketAddress\sdl_type = #IFT_ETHER
MACList + "Schnittstellenname: " +
PeekS(@*SocketAddress\sdl_data[0], *SocketAddress\sdl_nlen,
#PB_Ascii) + ", MAC = " +
GetMACAddress(*SocketAddress) + #CR$
EndIf
EndIf
*ListPointer = *ListPointer\ifa_next
Until *ListPointer = 0
freeifaddrs(*InterfaceList)
EndIf
ProcedureReturn MACList
EndProcedure
Define MACList.S
InitNetwork()
MACList = GetMACAddressesOfEthernetInterfaces()
If MACList <> ""
MessageRequester("MAC-Adressen aller Ethernet-Schnittstellen", MACList)
EndIf
Code: Alles auswählen
EnableExplicit
#AF_PACKET = 17
#ARPHRD_ETHER = 1 ; Ethernet 10/100Mbps
#SOCK_DGRAM = 2
ImportC ""
freeifaddrs(*InterfaceList)
getifaddrs(*InterfaceList)
EndImport
Structure ifaddrs
*ifa_next ; Next item in list
*ifa_name ; Name of interface
ifa_flags.I ; Flags from SIOCGIFFLAGS
*ifa_addr ; Address of interface
*ifa_netmask ; Netmask of interface
StructureUnion
*ifu_broadaddr ; Broadcast address of interface
*ifu_dstaddr ; Point-to-point destination address
EndStructureUnion
*ifa_data ; Address-specific data
EndStructure
Structure sockaddr_ll
sll_family.U ; Address family = AF_PACKET
sll_protocol.U ; Physical layer protocol
sll_ifindex.L ; Interface number
sll_hatype.U ; ARP hardware type
sll_pkttype.A ; Packet type
sll_halen.A ; Length of address
sll_addr.A[8] ; Physical layer address
EndStructure
Procedure.S GetMACAddress(*SocketAddress.sockaddr_ll)
Protected i.I
Protected MACAddress.S
If *SocketAddress\sll_halen > 0
For i = 0 To *SocketAddress\sll_halen - 1
MACAddress + RSet(Hex(*SocketAddress\sll_addr[i], #PB_Byte), 2, "0")
If i < *SocketAddress\sll_halen - 1
MACAddress + ":"
EndIf
Next i
EndIf
ProcedureReturn MACAddress
EndProcedure
Procedure.S GetMACAddressesOfEthernetInterfaces()
Protected InterfaceName.S
Protected *InterfaceList
Protected *ListPointer.ifaddrs
Protected MACList.S
Protected *SocketAddress.sockaddr_ll
If getifaddrs(@*InterfaceList) = 0
*ListPointer = *InterfaceList
Repeat
InterfaceName = PeekS(*ListPointer\ifa_name, -1, #PB_Ascii)
*SocketAddress = *ListPointer\ifa_addr
If *SocketAddress
If *SocketAddress\sll_family = #AF_PACKET And
*SocketAddress\sll_hatype = #ARPHRD_ETHER
MACList + "Schnittstelle: " + InterfaceName + ", MAC = " +
GetMACAddress(*SocketAddress) + #CR$
EndIf
EndIf
*ListPointer = *ListPointer\ifa_next
Until *ListPointer = 0
freeifaddrs(*InterfaceList)
EndIf
ProcedureReturn MACList
EndProcedure
Define MACList.S
InitNetwork()
MACList = GetMACAddressesOfEthernetInterfaces()
If MACList <> ""
MessageRequester("MAC-Adressen aller Ethernet-Schnittstellen", MACList)
EndIf