NetworkInterfaces - leider werden nur die aktiven ausgegeben...

rockente

Grünschnabel
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?

Java:
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
 
Zuletzt bearbeitet:
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…
 
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
Java:
getInputStream()
arbeiten

Also ungefähr so:
Java:
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!
 
Zuletzt bearbeitet:
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...

Java:
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();
		}
 
Zuletzt bearbeitet von einem Moderator:
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
Java:
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
Java:
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:
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 ...
 
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!
 
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 ...
 
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...
 
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 ...
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück