windows - opregner MAC adresser ved hjælp af kun Java 6, eller kun WMIC

Indlæg af Hanne Mølgaard Plasc

Problem



Som en del af min Windows eksklusive Java-applikation, skal jeg spørge forskellige hardwareegenskaber - CPU/BIOS/Harddisk serienummer og MAC-adresser.
Så jeg kan bruge WMIC og andre Windows-specifikke værktøjer via et Runtime.exec opkald.
At spørge CPU- og BIOS-serienumre er let; for eksempel,
wmic BIOS get SerialNumber gør tricket.
Jeg har ikke fundet en lignende enkel løsning til at liste ud MAC adresser.
wmic nic list brief vil vise mig en dårligt formateret liste, men parsing output med regex er en smerte.


Leder du efter WMIC-relaterede metoder peger alle på nogle variationer af følgende VBScript:


Set objWMIService = GetObject("winmgmts:\.
ootcimv2")
Set colItems = objWMIService.ExecQuery \_ 
("Select * from Win32\_NetworkAdapterConfiguration") 
For Each objItem in colItems 
if objItem.IPEnabled = 0 And objItem.ServiceName <> "VMnetAdapter" And isNull(objItem.MACAddress) = 0 Then 
Wscript.Echo objItem.MACAddress   
End if   
Next 


Lagring og kørsel af VBS er en sikkerhedsrisiko, så det er i øjeblikket gjort at skrive VBscript til en tekstfil, udføre og slette det. Dette er rodet og langsomt. Jeg har brugt wmic direkte til at spørge andre systemegenskaber , såsom BIOS serienummer.


En ren Java-løsning ville være meget bedre, men jeg har ikke stødt på nogen for alle tilgængelige MAC-adresser.
Det nærmeste jeg har set er dette, til IP-adresser.


Er der en måde at gøre dette fra Java?
Jeg bør tilføje, at jeg er begrænset til at bruge Java 6, selvom jeg hører Java 7, har mange flere nyttige netværks-API'er.


Opdatering : Glemt at tilføje det NetworkInterface returnerer mig kun IPv4 Ethernet MAC, ingen af ​​de andre virtuelle adaptere.

Bedste reference


Hvad forsøger du ikke at få adgang til WMI fra java? Måske med jWMI - Query Windows WMI fra Java [11]

Andre referencer 1


Jeg får MAC adresserne til VPN og andre grænseflader fra java.net.NetworkInterface. For alle dem, der er angivet med en 'Fysisk adresse' ved hjælp af kommandoen: ipconfig /all i det mindste tvivler vi på, at vi kan gøre det bedre end det?


public static void main(String[] args) {
    printNetworkInterfaces(NetworkInterface.getNetworkInterfaces(), 1);
}

private static void printNetworkInterfaces(Enumeration<NetworkInterface> netIfs, int indent) {
    for (NetworkInterface netIf : Collections.list(netIfs)) {
        System.out.printf("\%" + indent + "s\%s (\%s): \%s\%n", "", netIf.getName(), netIf.getDisplayName(), formatHwAddress(netIf));
        printNetworkInterfaces(netIf.getSubInterfaces(), indent + 2);
    }
}

....


Uddrag fra output:



  eth4 (Intel (R) 82579V Gigabit Network Connection): xx: xx: xx: xx: xx: xx < - en ægte MAC-adresse her

  net4 (Teredo Tunneling Pseudo-Interface): 00: 00: 00: 00: 00: 00: 00: e0

  net5 (Microsoft ISATAP Adapter): 00: 00: 00: 00: 00: 00: 00: e0

  eth12 (TAP-Win32 Adapter V9): xx: xx: xx: xx: xx: xx < - en ægte MAC-adresse her



Dette var ved hjælp af java 7u3 dog kan det være anderledes på java 6.

Andre referencer 2


Du kan få MAC-adresse i Java 1.6 via java.net.NetworkInterface.