tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
9
ZUGRIFFE
709
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    rockente rockente ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    5
    Heyho,

    ich möchte gerne von mehreren Rechner per Java die Mac-Adresse von der LAN + WLAN auslesen. Allerdings habe ich beim meinem kleinen Code das Problem, dass nur die aktiven Interfaces angezeigt werden und leider nicht diese, die keine Verbindung haben (also wenn ich nur per WLAN verbunden bin, wird die LAN-Verbindung nicht angezeigt) oder deaktiviert sind.
    Gibt es da eine Möglichkeit diese auch anzeigen zu lassen?

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    
    import java.net.NetworkInterface;
    import java.net.SocketException;
    import java.util.ArrayList;
    import java.util.Collections;
     
    public class Mac {
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            try {
                String[] ausgabe = getMacAddress();
                for(int i = 0; i < ausgabe.length; i++){
                    if(ausgabe[i] != null)
                    System.out.println(ausgabe[i]);
                }
            } catch (SocketException e) {
                e.printStackTrace();
            }
     
        }
     
        public static String[] getMacAddress() throws SocketException 
        { 
          String[] result = new String[10]; 
         ArrayList<NetworkInterface> test = Collections.list( NetworkInterface.getNetworkInterfaces());
         int anzahl = 0;
          for ( NetworkInterface ni : test ) 
          { 
            byte[] hardwareAddress = ni.getHardwareAddress(); 
            String zwischen = "";
            if ( hardwareAddress != null ) 
            { 
           
                for ( int i = 0; i < hardwareAddress.length; i++ ) 
                    zwischen += String.format( (i==0?"":"-")+"%02X", hardwareAddress[i] ); 
                } 
            result[anzahl] = zwischen;
            anzahl++;
          } 
         
          return result; 
        }
    }

    Der Code ist nicht schön formatiert bzw. schöne Variablennamen, war erstmal nur nen Test!
    Eigentlich funktioniert es auch, aber es besteht halt das oben genannte Problem...

    Vielen Dank schon einmal im voraus!

    mfg
    Geändert von rockente (09.02.11 um 11:16 Uhr)
     

  2. #2
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    Vielleicht gibt die Methode NetworkInterface.getNetworkInterfaces() nur aktive NetworkInterfaces zurück?
    Bei mir macht dein Code das selbe, er gibt die MAC-Adressen von einer real existierenden und einer virtuellen Verbindung aus, die beide aktiv sind, die 2. virtuelle Verbindung von virtualBox wird aber ignoriert.
    Wenn du wirklich alle (auch deaktivierte) haben möchtest, musst du vermutlich auf native Methoden zurückgreifen…
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  3. #3
    rockente rockente ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    5
    Schade =D wäre das einfachste gewesen...

    Kann man nicht eventuell den Process "ipconfig /all" aufrufen und die Ausgabe in Java weiterverarbeiten? Damit würde ich ja eigentlich alle Informationen bekommen.

    Bzw. ich könnte ja mit
    Code java:
    1
    
    getInputStream()
    arbeiten

    Also ungefähr so:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Runtime pr = Runtime.getRuntime();
            try {
                pr.exec("ipconfig /all");
                System.out.println((pr.exec("ipconfig /all").getInputStream()));
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    Allerdings wie kann ich den Stream sinnvoll weiterverarbeiten oder erstmal ausgeben, dann solle ich auch wissen, wie ich den weiterverarbeiten kann!
    Geändert von rockente (09.02.11 um 12:04 Uhr)
     

  4. #4
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    geht halt nur unter Windows. unter den meisten UNIX-basierten Betriebssystemen (Linux, Mac OS X?, BSD, …) nennt sich das dann ifconfig https://secure.wikimedia.org/wikipedia/en/wiki/Ifconfig
    Aber da musst du aufpassen, manche Begriffe werden übersetzt…
     
    Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  5. #5
    rockente rockente ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    5
    Die Windowsvariante reicht mir!

    Mein Problem ist jetzt nur, wie ich den InputStream weiterverarbeitet bekomme!

    Okay so gehts zumindest für die deutsche Windows version... nur die Frage ob auch mit Win7 und Vista...

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    try {
                Process pr = Runtime.getRuntime().exec("ipconfig /all");
                BufferedReader in = new BufferedReader(
                          new InputStreamReader(pr.getInputStream()) );
                        for ( String s; (s = in.readLine()) != null; ){
                            if(s.startsWith("        Hostname"))
                                System.out.println( s );
                            if(s.startsWith("        Beschreibung"))
                                System.out.println( s );
                            if(s.startsWith("        Physikalische"))
                            System.out.println( s );
                        }
     
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    Geändert von rockente (09.02.11 um 12:34 Uhr)
     

  6. #6
    SE Tutorials.de Gastzugang
    also entweder verwendest du ne zu alte VM oder hast keine rechte

    unter Win Vista Home Premium 32-Bit GER mit Java 7 bekommt man alles was man will

    source

    netinf.java
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    import java.io.*;
    import java.net.*;
    import java.util.*;
    public class netinf
    {
        public static void main(String[] args) throws Exception { new netinf(); }
        public netinf() throws Exception
        {
            Enumeration<NetworkInterface> num=NetworkInterface.getNetworkInterfaces();
            while(num.hasMoreElements())
            {
                NetworkInterface inf=num.nextElement();
                System.out.println(inf.toString());
                try { System.out.println("MAC "+tools.hex(inf.getHardwareAddress())); }
                catch(Exception e) { System.out.println("MAC FAILED"); }
            }
        }
    }

    tools.java
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    public class tools
    {
        public static String hex(byte[] input) throws Exception
        {
            StringBuffer sb=new StringBuffer(input.length*2);
            for(int i=0; i<input.length; i++)
            {
                int v=input[i]&0xFF;
                if(v<16)
                    sb.append("0");
                sb.append(Integer.toHexString(v));
            }
            return sb.toString().toUpperCase();
        }
        public static byte[] dehex(String input) throws Exception
        {
            byte[] ret=new byte[input.length()/2];
            for(int i=0; i<ret.length; i++)
            {
                int index=i*2;
                int v=Integer.parseInt(input.substring(index, index+2), 16);
                ret[i]=(byte)v;
            }
            return ret;
        }
    }

    und bei mir sieht das ganze so aus

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    
    PROMPT>java netinf
    name:lo (Software Loopback Interface 1) index: 1 addresses:
    /127.0.0.1;
    /0:0:0:0:0:0:0:1;
     
    MAC
    name:net0 (WAN-Miniport (L2TP)) index: 2 addresses:
     
    MAC FAILED
    name:net1 (WAN-Miniport (PPTP)) index: 3 addresses:
     
    MAC FAILED
    name:ppp0 (WAN-Miniport (PPPOE)) index: 4 addresses:
     
    MAC FAILED
    name:eth0 (WAN-Miniport (IPv6)) index: 5 addresses:
     
    MAC FAILED
    name:eth1 (WAN-Miniport (IP)) index: 6 addresses:
     
    MAC FAILED
    name:ppp1 (Asynchroner RAS-Adapter) index: 7 addresses:
     
    MAC FAILED
    name:eth2 (NVIDIA nForce Networking Controller) index: 8 addresses:
    /fe80:0:0:0:491a:65ca:11d4:f6df%8;
     
    MAC 001B24782958
    name:net2 (Broadcom 802.11g-Netzwerkadapter) index: 9 addresses:
    /10.60.0.175;
    /fe80:0:0:0:e95c:2838:9754:d0d%9;
     
    MAC 001A739449BE
    name:net3 (Teredo Tunneling Pseudo-Interface) index: 10 addresses:
    /fe80:0:0:0:0:100:7f:fffe%10;
     
    MAC 020054554E01
    name:net4 (WAN Miniport (SSTP)) index: 11 addresses:
     
    MAC FAILED
    name:eth3 (WAN-Miniport (Netzwerkmonitor)) index: 12 addresses:
     
    MAC FAILED
    name:net5 (isatap.{B6B3632E-78DD-4377-96AF-8E2CF0B1F92B}) index: 13 addresses:
     
    MAC 00000000000000E0
    name:eth4 (Hamachi Network Interface) index: 14 addresses:
    /5.175.183.76;
    /fe80:0:0:0:516f:483c:6a57:c822%14;
     
    MAC 7A79F541FF0B
    name:net6 (Microsoft-6zu4-Adapter) index: 15 addresses:
    /2002:5af:b74c:0:0:0:5af:b74c;
    /2002:5af:b74c:0:0:0:0:0;
     
    MAC 00000000000000E0
    name:net7 (isatap.imed.uni-magdeburg.de) index: 16 addresses:
    /fe80:0:0:0:0:5efe:a3c:af%16;
     
    MAC 00000000000000E0
    name:net8 (isatap.{1A0E68AF-00E1-47EF-BCFE-99453CB15CD7}) index: 17 addresses:
    /fe80:0:0:0:200:5efe:5af:b74c%17;
     
    MAC 00000000000000E0
    name:eth5 (WAN-Miniport (IPv6)-Zone Alarm Firewall Driver-0000) index: 20 addres
    ses:
     
    MAC FAILED
    name:eth6 (WAN-Miniport (IP)-Zone Alarm Firewall Driver-0000) index: 21 addresse
    s:
     
    MAC FAILED
    name:eth7 (WAN-Miniport (Netzwerkmonitor)-Zone Alarm Firewall Driver-0000) index
    : 22 addresses:
     
    MAC FAILED
    name:eth8 (WAN-Miniport (IPv6)-QoS Packet Scheduler-0000) index: 23 addresses:
     
    MAC FAILED
    name:eth9 (WAN-Miniport (IP)-QoS Packet Scheduler-0000) index: 24 addresses:
     
    MAC FAILED
    name:eth10 (WAN-Miniport (Netzwerkmonitor)-QoS Packet Scheduler-0000) index: 25
    addresses:
     
    MAC FAILED
    name:net9 (Broadcom 802.11g-Netzwerkadapter-QoS Packet Scheduler-0000) index: 26
     addresses:
     
    MAC FAILED
    name:net10 (Broadcom 802.11g-Netzwerkadapter-Native WiFi Filter Driver-0000) ind
    ex: 27 addresses:
     
    MAC FAILED
    name:net11 (Broadcom 802.11g-Netzwerkadapter-Zone Alarm Firewall Driver-0000) in
    dex: 28 addresses:
     
    MAC FAILED
     
    PROPMT>

    das MAC FAILED bedeutet das zum Interface keine MAC vorhanden ist
    wie du richtig liest ist mein LAN-Interface *NVIDIA nForce Net Controller* nicht verbunden da keine IPv4 adresse angegeben ist sondern lediglich die IPv6 die WIN vergeben hat ...
    bei den beiden Interfaces W-LAN *Broadcom 802.11g* und Hamachi steht jeweils auch eine IPv4 adresse ... was beduetet das diese verbunden sind *bei hamachi erledigt das eh die software*

    folglich ist an deinem code oder an deinen berechtigungen im system oder sogar am system selbst irgendwas nich in ordnung ...
    habe dasselbe auch schon mal unter meinem Win XP Pro 32-Bit gemacht *dort allerdings als Administrator und nicht wie auf dem Vista-System als "normaler" User* und auch dort hab ich alle MAC-adressen bekommen .. auch von den nicht-verbundenen
    nutze auf beiden rechnern Java 7 b120 ...
     

  7. #7
    rockente rockente ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    5
    Ah vielen Dank, das sieht schon mal nach einem sehr guten Ansatz aus!
    Auch wenn es an der VM zu scheinen liegt! Bis jetzt ist doch Java 7 nur nen Prerelease oder?
    Also zumindest habe ich es nicht anders gefunden und als offizielles update auf java 6 ist ja noch nicht draußen. Oder habe ich iwas nicht mit bekommen!

    Schonmal vielen Dank für den Ansatz!
     

  8. #8
    SE Tutorials.de Gastzugang
    ja ... das ist richtig ...
    JavaSE is immo in version 6 update 23 verfügbar
    JavaSE 7 gibbet nur als Early-Access build 120

    was jetzt genau das problem bei dir ist ist aber immer noch fraglich ...
    probier halt einfach mal mein code-snippet aus ob damit immernoch das problem besteht *keine panik .. ich bin für OpenSource ... jeder darf meine codes verwenden*
    wie gesagt ... wäre halt mal interessant was für ein system du genau nutz und wie es mit deinen rechten aussieht ...
    es kann nämlich sein das java halt keinen zugriff auf solche informationen bei dir hat ... sei es durch irgendne sichheitsrichtlinie *wobei mir da jetzt erlich gesagt keine einfallen würde* oder einfach nur weil dein code anderst arbeitet
    ich habe jetzt deinen code mal ausprobiert und er arbeitet wie er soll ... er gibt mir zu ALLEN interfaces die ich hab *verbunden , getrennt , deaktiviert , virtuell* dir MACs ...
    das deine beschränkung auf 10 beim ersten testlauf ne exception verursacht hat war mir eigentlich vorher klar ...
    weil dein code macht genau das was ich auch gelesen habe ... nämlich das er auch die leeren MACs mit in das array schreibt ... was erstmal zu nem haufen leerer Strings führt ... > speicherverschwendung ...
    habe zum test die grenze auf 64 angezogen *naja mit 1 GB RAM auf nem notebook mit vista muss man echt aufpassen wie viel man davon java gibt * ... und dann gings auch ... aber das is echt nich die lösung ...
    besser ist es dann schon so vorzugehen wie nach meinem code : beim durch-iteriren der interfaces gleich in der for *oder wie du es sehr elegant mit nem foreach - konstrukt gemacht hast* oder while auf die einzelnen MACs zu prüfen und bei einem leeren string *oder halt wenns NULL is* einfach mit continue dierekt beim nächsten weiter machen

    aber das erklärt immer noch nicht die sache das du nur informationen von verbundenen interfaces bekommst ... ich bekomm ja sogar zum nicht mal vorhandenen loopback infos *auch wenns nur die ip 127.0.0.1 is und keine mac .. aber immer hin*
    also wie oben erwähnt ... schreib einfach mal was du für n system hast ... oder teste deinen code mal auf nem anderen rechner um sicherzustellen das es eben nicht an deinem code liegt ...

    naja ... is echt nich leicht das problem ... aber ich bleib da auf jedenfall mal dran und versuch mal was zu simulieren ... aber ich glaube nicht das ich einen ähnlichen fehler reproduzieren kann ...
     

  9. #9
    rockente rockente ist offline Rookie
    Registriert seit
    Sep 2007
    Beiträge
    5
    Vielen Dank schonmal für deine Bemühungen!

    Also ich nutze atm Windows XP Pro und bin als "Admin" drin
    Dazu kommt dann halt Java 6 Update 23... ich denke das darin das Problem liegt, dass bei Java 7 noch was optimiert wurde.
    Mein Code vom Anfang war auch nur grob hinunter geschrieben ohne Kontrolle auf irgendwas

    Habe deine mal ausprobiert und da ist im endeffekt das gleiche Ergebnis, wie bei meinem Code... Es werden halt nur die aktiven ausgelesen.
    Bei der Lösung, dass ipconfig aufgerufen wird und die Ausgabe weiter verarbeitet wird, hat natürlich besser geklappt und es gibt mir auch die MAC-Adressen von nicht verbunden aus (wenn auch nicht von den deaktivierten).
    Deine Lösung habe ich gerade nochmal mit nicht verbundener Lan ausprobiert:
    Da zeigt er mir zwar die Lan-Verbindung an, kann aber keine MAC dazu auslesen. WEnn die Verbindung allerdings besteht, zeigt er mir die Mac-Adresse an. Sehr komisch irgendwie...
     

  10. #10
    SE Tutorials.de Gastzugang
    also ich habe mir jetzt *leider umständlich* ebenfalls v6 u23 installiert ... die class neu compiled und mit v6 u23 ausgeführt ... und ich erhalte immer noch alle MACs des systems ...
    bin grad dabei mir XP Pro SP2 auf ne VirtualBox zu ziehen ... *keine panic an alle .. is original mit originalem key* ... werd mein ergebnis mit v6u23 und v7b120 dann posten

    update 1
    v6u23 : zeigt nur aktivierte und verbundene MACs ... bei nicht-verbunden oder deaktiviert wird keine MAC zurückgegeben

    update 2
    v7b120 : nur aktivierte aber auch nicht-verbundene unter XP
    unter vista *ich habs doch noch mal ausprobiert* nur aktivierte aber auch nicht-verbundene ...
    *hab zum test mal mein hamachi-interface deaktiviert ... dann wars auch plötzlich in der liste weg*

    folglich scheint es unter XP schon daran liegen das aktivierte aber nicht-verbundene nur bei v6 nicht angezeigt werden ... unter v7 werden dann auch nicht-verbundene angezeigt ... so lange sie halt aktiviert sind ...
    unter vista geht das schon mit v6 ... aber hier auch wieder nur die aktivierten interfaces ...
    auch IPCONFIG /ALL gibt nur die aktivierten interfaces aus ... die deaktivierten interfaces werden unter keinen umständen angezeigt ... ob es an den treibern liegt oder an windows selbst weis ich nicht ...
    ich habe grade kein unix als image ... müsste mir erst umständlich übers netz installieren ... werd ich heute abend mal in angriff nehmen ...
    kuggn wie es dann unter unix aussieht ...
    Geändert von SE (10.02.11 um 15:51 Uhr)
     

Ähnliche Themen

  1. Daten werden komisch ausgegeben
    Von veil123 im Forum PHP
    Antworten: 12
    Letzter Beitrag: 26.02.10, 23:18
  2. Antworten: 3
    Letzter Beitrag: 14.12.07, 20:04
  3. mit AND werden keine Daten ausgegeben
    Von vedam im Forum PHP
    Antworten: 3
    Letzter Beitrag: 24.05.07, 13:20
  4. Antworten: 2
    Letzter Beitrag: 01.12.06, 17:00
  5. Variablen werden nicht ausgegeben
    Von chpa im Forum PHP
    Antworten: 3
    Letzter Beitrag: 22.08.04, 21:01

Stichworte