Re: Mac-Adresse
Verfasst: 29.11.2014 21:01
Der Code funktioniert dennoch nicht 

stevie1401 hat geschrieben:Funktionieren tut das Beispiel übrigens auch nicht. Hätte mich auch gewundert.
Wenn's bei Dir nicht läuft, liegt's wahrscheinlich eher an Deinen Einstellungen als am Code ... und das mein ich nicht nur literal.und hat geschrieben:Der Code funktioniert dennoch nicht
anfangs hat geschrieben:Ich benötige die Mac-Adresse des Rechners, auf dem mein Programm läuft.
Was denn nun?dann hat geschrieben:Ich möchte die MAC-ADRESSE meines Rechners erfahren.
Nunja... ist nur Windows...RSBasic hat geschrieben:Alternativ: http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb
ausserdem hattest du das schon gepostet....stevie1401 hat geschrieben:Ich benötige die Mac-Adresse des Rechners, auf dem mein Programm läuft.
Wie kann ich die mit PB herausfinden?
Ich brauche Code für alle Plattformen.
Mit nativen PB-Mitteln ist das nicht möglich! Deshalb muss man halt auf API zugreifen und da er gerne eine Lösung für alle Plattformen haben möchte, müssen sowohl eine Linux-, MacOS- als auch eine Windows-Lösung gepostet werden. Da ich aber keine Ahnung von Linux und MacOS habe, kann ich nur eine Windows-Lösung anbieten. Jemand, der sich mit Linux API auskennt, kann gerne ebenfalls eine Lösung posten.RSBasic hat geschrieben:Lösungen für Linux und MacOS musst du noch warten, bis sich ein Linux- und MacOS-User meldet.
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
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
Ja, das war beabsichtigt. Eine Lösung zum Ermitteln der MAC-Adresse habe ich bereits anfangs gepostet:Shardik hat geschrieben:Das verlinkte Windows-Beispiel von RSBasic ermittlet die Hardware GUID, aber nicht die gewünschte MAC-Adresse [...]
Der von mir später verlinkte Code war ein alternativer Code. Ich habe ja vorher "Alternativ" geschrieben, weil stevie1401 gerne unterschiedliche Rechner feststellen möchte. Das heißt, man könnte auch mit Hilfe der Hardware-GUID feststellen, ob es derselbe PC ist:RSBasic hat geschrieben:Für Windows: http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb
RSBasic hat geschrieben:Alternativ: http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb