Seite 2 von 3

Re: Mac-Adresse

Verfasst: 29.11.2014 21:01
von stevie1401
Der Code funktioniert dennoch nicht ;-)

Re: Mac-Adresse

Verfasst: 29.11.2014 22:52
von Vera
stevie1401 hat geschrieben:Funktionieren tut das Beispiel übrigens auch nicht. Hätte mich auch gewundert.
und hat geschrieben:Der Code funktioniert dennoch nicht ;-)
Wenn's bei Dir nicht läuft, liegt's wahrscheinlich eher an Deinen Einstellungen als am Code ... und das mein ich nicht nur literal.
anfangs hat geschrieben:Ich benötige die Mac-Adresse des Rechners, auf dem mein Programm läuft.
dann hat geschrieben:Ich möchte die MAC-ADRESSE meines Rechners erfahren.
Was denn nun?
... 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.

Re: Mac-Adresse

Verfasst: 01.12.2014 08:47
von stevie1401
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.

Re: Mac-Adresse

Verfasst: 01.12.2014 10:11
von RSBasic

Re: Mac-Adresse

Verfasst: 01.12.2014 10:19
von Bisonte
RSBasic hat geschrieben:Alternativ: http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb
Nunja... ist nur Windows...
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.
ausserdem hattest du das schon gepostet.... ;)

Re: Mac-Adresse

Verfasst: 01.12.2014 10:29
von RSBasic
Das weiß ich doch! Deshalb hab ich schon davor folgendes gesagt:
RSBasic hat geschrieben:Lösungen für Linux und MacOS musst du noch warten, bis sich ein Linux- und MacOS-User meldet.
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.

Re: Mac-Adresse

Verfasst: 01.12.2014 10:46
von NicTheQuick
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

Verfasst: 01.12.2014 11:09
von Shardik
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:

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
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.

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
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):

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

Re: Mac-Adresse

Verfasst: 01.12.2014 11:43
von stevie1401
Vielen herzlichen Dank! :allright:

Re: Mac-Adresse

Verfasst: 01.12.2014 12:19
von RSBasic
Shardik hat geschrieben:Das verlinkte Windows-Beispiel von RSBasic ermittlet die Hardware GUID, aber nicht die gewünschte MAC-Adresse [...]
Ja, das war beabsichtigt. Eine Lösung zum Ermitteln der MAC-Adresse habe ich bereits anfangs gepostet:
RSBasic hat geschrieben:Für Windows: http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb
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:Alternativ: http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb