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