2017-09-20 2 views
-5

Ich muss Mac-Adresse von einem Gerät erhalten, wenn diese MAC-Adresse für alle Typen dieses Geräts eindeutig sein sollte und nicht in der Zeit änderbar. Ich lese viele Themen und probiere sie aus, aber kein einziger Weg hilft nicht. Im Folgenden sind alle Möglichkeiten, die ich verwendet habe.Wie bekomme ich MAC-Adresse von Gerät

Von Motherboard:

public static String getMotherboardSN() { 
     String result = ""; 
     try { 
      File file = File.createTempFile("realhowto", ".vbs"); 
      file.deleteOnExit(); 
      FileWriter fw = new java.io.FileWriter(file); 

      String vbs = 
        "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n" 
          + "Set colItems = objWMIService.ExecQuery _ \n" 
          + " (\"Select * from Win32_BaseBoard\") \n" 
          + "For Each objItem in colItems \n" 
          + " Wscript.Echo objItem.SerialNumber \n" 
          + " exit for ' do the first cpu only! \n" 
          + "Next \n"; 

      fw.write(vbs); 
      fw.close(); 
      Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath()); 
      BufferedReader input = 
        new BufferedReader 
          (new InputStreamReader(p.getInputStream())); 
      String line; 
      while ((line = input.readLine()) != null) { 
       result += line; 
      } 
      input.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return result.trim(); 
    } 

Von HDD:

public static String getSerialNumber(String drive) { 
     String result = ""; 
     try { 
      File file = File.createTempFile("realhowto",".vbs"); 
      file.deleteOnExit(); 
      FileWriter fw = new java.io.FileWriter(file); 

      String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n" 
        +"Set colDrives = objFSO.Drives\n" 
        +"Set objDrive = colDrives.item(\"C\")\n" 
        +"Wscript.Echo objDrive.SerialNumber"; // see note 
      fw.write(vbs); 
      fw.close(); 
      Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath()); 
      BufferedReader input = 
        new BufferedReader 
          (new InputStreamReader(p.getInputStream())); 
      String line; 
      while ((line = input.readLine()) != null) { 
       result += line; 
      } 
      input.close(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return result.trim(); 
    } 

Von CPU:

private static String getWindowsCPU_SerialNumber() { 
     String result = ""; 
     try { 
      File file = File.createTempFile("realhowto",".vbs"); 
      file.deleteOnExit(); 
      FileWriter fw = new java.io.FileWriter(file); 

      String vbs1= 
        "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n" 
          + "Set colItems = objWMIService.ExecQuery _ \n" 
          + " (\"Select * from Win32_Processor\") \n" 
          + "For Each objItem in colItems \n" 
          + " Wscript.Echo objItem.ProcessorId \n" 
          + " exit for ' do the first cpu only! \n" 
          + "Next \n"; 


      fw.write(vbs1); 
      fw.close(); 

      Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath()); 
      BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line; 
      while ((line = input.readLine()) != null) { 
       result += line; 
      } 
      input.close(); 
     } 
     catch(Exception E){ 
      System.err.println("Windows CPU Exp : "+E.getMessage()); 
     } 
     return result.trim(); 
    } 

Dies ist von UUID:

private void getUUID(){ 
     String uniqueID = UUID.randomUUID().toString(); 
     System.out.println(uniqueID); 
    } 

Von InetAddress:

private void getMacFromInetAddress(){ 
    String mmm = "123"; 
    try { 
      InetAddress ip = InetAddress.getLocalHost(); 
      System.out.println("Current IP address : " + ip.getHostAddress()); 

      Enumeration<NetworkInterface> networks = NetworkInterface.getNetworkInterfaces(); 
      while (networks.hasMoreElements()) { 
       NetworkInterface network = networks.nextElement(); 
       byte[] mac = network.getHardwareAddress(); 

       if (mac != null) { 
        System.out.print("Current MAC address : "); 

        StringBuilder sb = new StringBuilder(); 
        for (int i = 0; i < mac.length; i++) { 
         sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : "")); 
        } 
        mmm = sb.toString(); 
        System.out.println(mmm); 
       } 
      } 
     } catch (UnknownHostException | SocketException e) { 
      System.out.println(e.getLocalizedMessage()); 
     } 
} 

Auf den Methoden von MB, HDD, CPU, InetAddress wenn ich den Code auf mehrere identische Parameter Computern ausgeführt werden, kehren sie den gleichen Code. Von UUID, wenn Code ausgeführt wird, gab es zum ersten Mal einen anderen Code, zum zweiten Mal einen anderen Code. Wie bekomme ich eine eindeutige ID für einen Computer, wenn er sich nicht mit der Zeit auf Java ändert? Ich habe OS Windows benutzt.

Antwort

0

Verwenden Sie die UUID mit einigen Änderungen

ersten Mal ausgeführt wird, erzeugen eine einzigartige UUID und speichern Sie es in lokalen Speicher. Ab dem 2. Mal verwenden Sie die gespeicherte UUID ab dem 1. Lauf.

+0

sagen wir das: mein Programm für jede Maschine gibt nur einen eindeutigen Schlüssel. Wenn ich uuid erzeuge und lokalen Speicher speichere, dann kopiert der Klient dieses Programm mit lokalem Speicher und setzt ihn auf einen anderen Rechner anstelle mit einem lokalen Schlüssel .... – Saahon

1

Wie bekomme ich Mac-Adresse vom Gerät?

Es gibt keinen direkten Weg mac address aus dem System durch Java zu bekommen. Aber Sie können

Um Mac-Adressen auf dem Computer zu erhalten, führen Sie einfach den Befehl getmac, um die MAC-Adressen zu erhalten. enter image description here

  1. Verwenden Sie dazu den Befehl ipconfig.
  2. Rufen Sie die Mac-Adressen für einen Remotecomputer mit dem Befehl nbtstat ab.
  3. Führen Sie die Befehle getmac und getmac /s remote_computer /u username /p password aus, um die MAC-Adressen eines Remotecomputers abzurufen.

Get mac address from command line

Aber durch Java benötigen Sie Java exec system with Java ProcessBuilder and Process

Zum Beispiel verwenden:

ProcessBuilder pb = new ProcessBuilder("getmac"); 
//Map<String, String> env = pb.environment(); //set env 
pb.directory("C\\"); 
Process p = pb.start(); 

oder

// build my command as a list of strings 
//@@@ For Unix/Linux 
List<String> command = new ArrayList<String>(); 
command.add("getmac"); 

// execute my command 
SystemCommandExecutor commandExecutor = new SystemCommandExecutor(command); 
int result = commandExecutor.executeCommand(); 

Dann lesen Ausgabe durch:

// get the output from the command 
StringBuilder stdout = commandExecutor.getStandardOutputFromCommand(); 
StringBuilder stderr = commandExecutor.getStandardErrorFromCommand(); 

// print the output from the command 
System.out.println("STDOUT"); 
System.out.println(stdout); 
System.out.println("STDERR"); 
System.out.println(stderr); 

ProcessBuilder and Process Code

Note: Ihr java application Notwendigkeit administrative permission during execution.

2
InetAddress ip = InetAddress.getLocalHost(); 
System.out.println("Current IP address : " + ip.getHostAddress()); 

NetworkInterface network = NetworkInterface.getByInetAddress(ip); 

byte[] mac = network.getHardwareAddress(); 

System.out.print("Current MAC address : "); 

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

und die Hardware-Informationen zu erhalten u wmic Befehle wie wmic cpu erhalten processorID

Process p = Runtime.getRuntime().exec("wmic cpu get ProcessorId"); 
      String procesSerial= 
        new BufferedReader 
          (new InputStreamReader(p.getInputStream())).[ReadSecondLine]; 

und BIOS

wmic BIOS erhalten Serial

Process p = Runtime.getRuntime().exec("wmic bios get SerialNumber"); 
verwenden können
+1

kann man sogar die Liste der Ethernetadapter/Macadresse erhalten, wenn Sie wollen –

+0

Freund, hier und MAC-Adresse virtuelle Netzwerkadapter, gibt auch und dann wird die gleiche MAC-Adressen auf mehreren Maschinen sein – Saahon

+0

@Saahon Dann erstellen Sie eine Kombination String wie CPUID + "|" + BIOSserial + "|" + MAC so wird die Duplizierung minimiert. Wenn Sie Hardware-Informationen lesen möchten, ist es nicht mehr plattformunabhängig. Danke. –

0

Ich empfehle Ihnen, die oshi library zu betrachten, um System OS/Hardware Informationen zu erhalten.

Blick auf die test case für das Beispiel.

Unten ist die abgeschnittene Ausgabe auf meinem System.

Microsoft Windows 7 SP1 build 7601 
manufacturer: LENOVO 
model: 20AWA0MAIN 
serialnumber: PB01FEYL 
baseboard: 
    manufacturer: LENOVO 
    serialnumber: L1HF43B026Z    
Intel(R) Core(TM) i7-4600M CPU @ 2.90GHz 
2 physical CPU(s) 
4 logical CPU(s) 
Identifier: Intel64 Family 6 Model 60 Stepping 3 
ProcessorID: BFEBFBFF000306C3 
Memory: 9.2 GiB/15.7 GiB 
Swap used: 0 bytes/15.7 GiB 
Uptime: 0 days, 04:24:20 
Disks: 
\\.\PHYSICALDRIVE0: (model: HGST HTS725050A7E6300 SCSI Disk Device (Standard disk drives) - S/N:  TF655AWH2RKE6L) size: 500.1 GB, reads: 325475 (7.1 GiB), writes: 306825 (4.4 GiB), xfer: 12447064 ms 
|-- Disk #0, Partition #0: Installable File System (Installable File System) Maj:Min=0:0, size: 104.9 MB 
Network interfaces: 
Name: eth8 (Intel(R) Ethernet Connection I217-LM) 
    MAC Address: 28:d2:44:68:40:23 
    MTU: 1500, Speed: 0 bps 
    IPv4: [] 
    IPv6: [fe80:0:0:0:553d:8bc9:6a95:236e] 
    Traffic: received ?/?; transmitted ?/? 
Name: wlan9 (Intel(R) Dual Band Wireless-N 7260) 
    MAC Address: 7c:7a:91:37:cb:f7 
    MTU: 1500, Speed: 130 Mbps 
    IPv4: [192.168.1.66] 
    IPv6: [fe80:0:0:0:55e0:97b3:f282:4c06] 
    Traffic: received 121644 packets/114.0 MiB (0 err); transmitted 90086 packets/12.7 MiB (0 err) 
Displays: 
Display 0: 
    Manuf. ID=LEN, Product ID=40a0, Analog, Serial=00000000, ManufDate=1/2012, EDID v1.4 
    31 x 17 cm (12.2 x 6.7 in) 
    Preferred Timing: Clock 72MHz, Active Pixels 2656x768 
    Preferred Timing: Clock 63MHz, Active Pixels 2656x768 
    Manufacturer Data: 0000000F008C09328C093214090006AF3C33 
    Unspecified Text: B140XTN03.3 
Verwandte Themen