
Mac-Adresse
-
- Beiträge: 700
- Registriert: 19.10.2014 15:51
- Kontaktdaten:
Re: Mac-Adresse
Der Code funktioniert dennoch nicht 

Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Linux Mint 21.x
- Vera
- Beiträge: 928
- Registriert: 18.03.2009 14:47
- Computerausstattung: Win XP SP2, Suse 11.1
- Wohnort: Essen
Re: Mac-Adresse
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.
... funktionieren cat address und ifconfig bei Dir auch nicht?
... und wozu überhaupt, muß man fremde Rechner ausspionieren wollen?

ps: hast Du überhaupt einen MAC-Rechner? Wenn ja, dann steht seine Addresse in Deinem Perso.
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
-
- Beiträge: 700
- Registriert: 19.10.2014 15:51
- Kontaktdaten:
Re: Mac-Adresse
Ich benötige die Mac-Adresse zur Erkennung von Spielerrechnern. Das hat recht wenig mit Ausspionieren zu tun.
Da die Spieler auf sehr unterschiedlichen Rechnern mit sehr unterschiedlichen Einstellungen spielen, sollte die Einstellung eines Rechners keine Rolle spielen.
Der Code funktioniert auf keinem meiner Rechner - und ich habe recht viele.
Da die Spieler auf sehr unterschiedlichen Rechnern mit sehr unterschiedlichen Einstellungen spielen, sollte die Einstellung eines Rechners keine Rolle spielen.
Der Code funktioniert auf keinem meiner Rechner - und ich habe recht viele.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Linux Mint 21.x
Re: Mac-Adresse
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.

PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom
Re: Mac-Adresse
Das weiß ich doch! Deshalb hab ich schon davor folgendes gesagt:
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.
- NicTheQuick
- Ein Admin
- Beiträge: 8807
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Mac-Adresse
Die Lösung für Linux habe ich auch schon gepostet. Da braucht man auch keine API, sondern kann direkt auf das virtuelle Dateisystem unter /sys/class/net zugreifen.
Re: Mac-Adresse
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
Zuletzt geändert von Shardik am 01.12.2014 12:35, insgesamt 1-mal geändert.
-
- Beiträge: 700
- Registriert: 19.10.2014 15:51
- Kontaktdaten:
Re: Mac-Adresse
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