it-swarm.com.de

MAC-Adresse mit Java auf dem lokalen Computer abrufen

Ich kann nutzen 

ip = InetAddress.getLocalHost();
NetworkInterface.getByInetAddress(ip);

um die MAC-Adresse zu erhalten, aber wenn ich diesen Code in einer Offline-Maschine verwende, funktioniert er nicht.

So, Wie bekomme ich die Mac-Adresse?

23
Jevivre xavie

Mit Java 6+ können Sie NetworkInterface.getHardwareAddress verwenden.

Beachten Sie, dass ein Computer keine Netzwerkkarten haben kann, insbesondere wenn er eingebettet oder virtuell ist. Es kann auch mehr als eine haben. Mit NetworkInterface.getNetworkInterfaces() können Sie eine Liste aller Netzwerkkarten erhalten.

29
phihag

Mit all den möglichen Lösungen, die ich hier gefunden habe, und weiteren Antworten, werde ich mit meiner Lösung beitragen. Sie müssen einen Parameter mit einem String angeben, der "ip" oder "mac" enthält, je nachdem, was Sie überprüfen müssen. Wenn der Computer über keine Schnittstelle verfügt, wird ein String zurückgegeben, der null enthält. Andernfalls wird ein String zurückgegeben, der das enthält, wonach Sie gefragt haben (die IP-Adresse oder der Mac).

Wie man es benutzt:

System.out.println("Ip: " + GetNetworkAddress.GetAddress("ip"));
System.out.println("Mac: " + GetNetworkAddress.GetAddress("mac"));

Ergebnis (wenn der Computer eine Netzwerkkarte hat):

Ip: 192.168.0.10 
Mac: 0D-73-ED-0A-27-44

Ergebnis (wenn der Computer keine Netzwerkkarte hat):

Ip: null
Mac: null

Hier ist der Code:

import Java.net.Inet4Address;
import Java.net.InetAddress;
import Java.net.NetworkInterface;
import Java.net.SocketException;
import Java.net.UnknownHostException;
import Java.util.Enumeration;

public class GetNetworkAddress {

    public static String GetAddress(String addressType) {
        String address = "";
        InetAddress lanIp = null;
        try {

            String ipAddress = null;
            Enumeration<NetworkInterface> net = null;
            net = NetworkInterface.getNetworkInterfaces();

            while (net.hasMoreElements()) {
                NetworkInterface element = net.nextElement();
                Enumeration<InetAddress> addresses = element.getInetAddresses();

                while (addresses.hasMoreElements() && element.getHardwareAddress().length > 0 && !isVMMac(element.getHardwareAddress())) {
                    InetAddress ip = addresses.nextElement();
                    if (ip instanceof Inet4Address) {

                        if (ip.isSiteLocalAddress()) {
                            ipAddress = ip.getHostAddress();
                            lanIp = InetAddress.getByName(ipAddress);
                        }

                    }

                }
            }

            if (lanIp == null)
                return null;

            if (addressType.equals("ip")) {

                address = lanIp.toString().replaceAll("^/+", "");

            } else if (addressType.equals("mac")) {

                address = getMacAddress(lanIp);

            } else {

                throw new Exception("Specify \"ip\" or \"mac\"");

            }

        } catch (UnknownHostException ex) {

            ex.printStackTrace();

        } catch (SocketException ex) {

            ex.printStackTrace();

        } catch (Exception ex) {

            ex.printStackTrace();

        }

        return address;

    }

    private static String getMacAddress(InetAddress ip) {
        String address = null;
        try {

            NetworkInterface network = NetworkInterface.getByInetAddress(ip);
            byte[] mac = network.getHardwareAddress();

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < mac.length; i++) {
                sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
            }
            address = sb.toString();

        } catch (SocketException ex) {

            ex.printStackTrace();

        }

        return address;
    }

    private static boolean isVMMac(byte[] mac) {
        if(null == mac) return false;
        byte invalidMacs[][] = {
                {0x00, 0x05, 0x69},             //VMWare
                {0x00, 0x1C, 0x14},             //VMWare
                {0x00, 0x0C, 0x29},             //VMWare
                {0x00, 0x50, 0x56},             //VMWare
                {0x08, 0x00, 0x27},             //Virtualbox
                {0x0A, 0x00, 0x27},             //Virtualbox
                {0x00, 0x03, (byte)0xFF},       //Virtual-PC
                {0x00, 0x15, 0x5D}              //Hyper-V
        };

        for (byte[] invalid: invalidMacs){
            if (invalid[0] == mac[0] && invalid[1] == mac[1] && invalid[2] == mac[2]) return true;
        }

        return false;
    }

}

AKTUALISIERT 02/05/2017: Danke an @mateuscb über den Beitrag So ermitteln Sie die Internet-Netzwerkschnittstelle in Java die leider keinen Beitrag zu diesem Beitrag erhalten hat, trug jedoch zu diesem Update bei.

Die Methode wurde verbessert, um Netzwerkkarten für virtuelle Maschinen zu überspringen (die beliebteste Software VM).

20
Jesus Flores

Wenn der Computer offline ist, wird ihm normalerweise keine IP zugewiesen, da DHCP weit verbreitet ist.

Und für die Frage im Titel: NetworkInterface.getHardwareAddress()

5
Uku Loskit

Versuche dies:

final NetworkInterface netInf = NetworkInterface.getNetworkInterfaces().nextElement();
final byte[] mac = netInf.getHardwareAddress();
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
        sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
}
log.info("Mac addr: {}", sb.toString());
1
Rudi Wijaya

Eine andere Möglichkeit ist die Verwendung des Betriebssystembefehls 'getmac' durch die Ausführung von nativem Code.

    Process p = Runtime.getRuntime().exec("getmac /fo csv /nh");
    Java.io.BufferedReader in = new Java.io.BufferedReader(new  Java.io.InputStreamReader(p.getInputStream()));
    String line;
    line = in.readLine();        
    String[] result = line.split(",");

    System.out.println(result[0].replace('"', ' ').trim());
1
Olantobi

Mittlere Zugriffskontrolladresse ( MAC-Adresse )

Die MAC-Adresse eines Geräts ist eine eindeutige Kennung, die einem Network Interface Controller (NIC) zugewiesen wird. Für die Kommunikation innerhalb eines Netzwerksegments wird es als Netzwerkadresse für die meisten IEEE 802-Netzwerktechnologien verwendet, einschließlich Ethernet, Wi-Fi und Bluetooth. Innerhalb des Open Systems Interconnection ( OSI ) Modells werden MAC-Adressen in der Teilschicht des Medium Access Control Protocol der Datenverbindungsschicht verwendet.

MAC-Adressen werden am häufigsten vom Hersteller von Netzwerkkarten vergeben. Jedes ist in der Hardware gespeichert, z. B. im Nur-Lese-Speicher der Karte oder über einen Firmware-Mechanismus.

Verwenden Sie die folgende Funktion getPhysicalAddress(), um die Liste der MAC-Adressen abzurufen:

static String format = "%02X"; // To get 2 char output.
private static String[] getPhysicalAddress() throws Exception{
    try {
        // DHCP Enabled - InterfaceMetric
        Set<String> macs = new LinkedHashSet<String>();

        Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
        while( nis.hasMoreElements() ) {
            NetworkInterface ni = nis.nextElement();
            byte mac [] = ni.getHardwareAddress(); // Physical Address (MAC - Medium Access Control)
            if( mac != null ) {
                final StringBuilder macAddress = new StringBuilder();
                for (int i = 0; i < mac.length; i++) {
                    macAddress.append(String.format("%s"+format, (i == 0) ? "" : ":", mac[i]) );
                    //macAddress.append(String.format(format+"%s", mac[i], (i < mac.length - 1) ? ":" : ""));
                }
                System.out.println(macAddress.toString());
                macs.add( macAddress.toString() );
            }
        }
        return macs.toArray( new String[0] );
    } catch( Exception ex ) {
        System.err.println( "Exception:: " + ex.getMessage() );
        ex.printStackTrace();
    }
    return new String[0];
}
public static void main(String[] args) throws Exception {
    InetAddress localHost = InetAddress.getLocalHost();
    System.out.println("Host/System Name : "+ localHost.getHostName());
    System.out.println("Host IP Address  : "+ localHost.getHostAddress());

    String macs2 [] = getPhysicalAddress();
    for( String mac : macs2 )
        System.err.println( "MacAddresses = " + mac );
}

Die obige Funktion funktioniert als ipconfig/all|find "Physical Address" >>MV-mac.txt.

D:\>ipconfig /all|find "Physical Address"
   Physical Address. . . . . . . . . : 94-57-A6-00-0C-BB
   Physical Address. . . . . . . . . : 01-FF-60-93-0B-88
   Physical Address. . . . . . . . . : 62-B8-9A-2B-F3-87
   Physical Address. . . . . . . . . : 60-B8-9A-2B-F3-87
   Physical Address. . . . . . . . . : 60-B8-9A-2B-F3-87

Das IEEE unterteilt die OSI-Datenverbindungsschicht in zwei separate Unterschichten:

  • Logical Link Control (LLC): Übergänge bis zur Netzwerkschicht
  • MAC: Übergänge zur physischen Ebene Bildreferenz

getmac

Gibt die MAC-Adresse (Media Access Control) und eine Liste der Netzwerkprotokolle zurück, die jeder Adresse für alle Netzwerkkarten in jedem Computer entweder lokal oder netzwerkweit zugeordnet sind.

D:\>getmac /fo csv /nh

NET START Befehl

D:\>netsh interface ipv4 show addresses
0
Yash

Bereinigter Code von hier :

import Java.net.InetAddress;
import Java.net.NetworkInterface;
import Java.net.SocketException;
import Java.net.UnknownHostException;

public class HardwareAddress
{
    public static String getMacAddress() throws UnknownHostException,
            SocketException
    {
        InetAddress ipAddress = InetAddress.getLocalHost();
        NetworkInterface networkInterface = NetworkInterface
                .getByInetAddress(ipAddress);
        byte[] macAddressBytes = networkInterface.getHardwareAddress();
        StringBuilder macAddressBuilder = new StringBuilder();

        for (int macAddressByteIndex = 0; macAddressByteIndex < macAddressBytes.length; macAddressByteIndex++)
        {
            String macAddressHexByte = String.format("%02X",
                    macAddressBytes[macAddressByteIndex]);
            macAddressBuilder.append(macAddressHexByte);

            if (macAddressByteIndex != macAddressBytes.length - 1)
            {
                macAddressBuilder.append(":");
            }
        }

        return macAddressBuilder.toString();
    }
}
0
BullyWiiPlaza

@Jesus Flores, der immer noch nicht funktioniert, dieser Code: 

element.getHardwareAddress().length > 0 

wirft eine Ausnahme. Wir müssen auf null prüfen. Endlösung in Ihrem Fall, die für mich funktioniert:

            while (addresses.hasMoreElements()
                    && element.getHardwareAddress() != null
                    && element.getHardwareAddress().length > 0
                    && !isVMMac(element.getHardwareAddress())) {
                final InetAddress ip = addresses.nextElement();
                if (ip instanceof Inet4Address) {
                    // || ip instanceof Inet6Address
                    if (ip.isSiteLocalAddress()) {
                        ipAddress = ip.getHostAddress();
                        lanIp = InetAddress.getByName(ipAddress);
                    }
                }
            }

Ich arbeite immer über Wi-Fi.

0
vdizdarevic