Перечислять MAC-адреса, используя только Java 6 или только WMIC - PullRequest
0 голосов
/ 29 февраля 2012

Как часть моего эксклюзивного Java-приложения для Windows, мне нужно запросить различные аппаратные свойства - серийный номер CPU / BIOS / жесткого диска и MAC-адреса. Так что я могу использовать WMIC и другие специфичные для Windows инструменты через вызов Runtime.exec. Запрашивать серийные номера процессора и BIOS очень просто; например, wmic BIOS get SerialNumber делает свое дело. Я не нашел аналогичного простого решения для перечисления MAC-адресов. wmic nic list brief покажет мне плохо отформатированный список, но тогда анализ вывода с помощью регулярных выражений будет проблематичным.

При поиске методов, связанных с WMIC, все указывают на некоторые вариации следующего VBScript:

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
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 

Хранение и запуск VBS представляет угрозу безопасности, поэтому в настоящее время выполняется запись VBscript в текстовый файл, выполнение, а затем его удаление. Это грязно и медленно. Я использовал wmic напрямую для запроса других системных свойств, таких как серийный номер BIOS.

Чистое Java-решение было бы намного лучше, но я не встречал ни одного для всех доступных MAC-адресов. Самое близкое, что я видел, это это для IP-адресов.

Есть ли способ сделать это из Java? Я должен добавить, что я ограничен использованием Java 6, хотя я слышал, что в Java 7 гораздо более полезные сетевые API.

Обновление : забыл добавить, что NetworkInterface возвращает мне только IPv4 Ethernet MAC, ни один из других виртуальных адаптеров.

Ответы [ 3 ]

1 голос
/ 04 марта 2012

Я получаю MAC-адреса для VPN и других интерфейсов от java.net.NetworkInterface.Для всех перечисленных с «Физическим адресом», используя команду: ipconfig /all хотя бы, сомневаемся, что мы можем добиться большего успеха?

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);
    }
}

....

Извлечение из вывода:

eth4 (Intel (R) 82579V Gigabit Network Connection): xx: xx: xx: xx: xx: xx <- здесь настоящий MAC-адрес <br>net4 (псевдо-интерфейс Teredo Tunneling): 00:00:00:00: 00: 00: 00: e0
net5 (адаптер Microsoft ISATAP): 00: 00: 00: 00: 00: 00: 00: e0
eth12 (адаптер TAP-Win32 V9): xx: xx:xx: xx: xx: xx <- реальный MAC-адрес здесь </p>

Это было с использованием Java 7u3, хотя, может отличаться на Java 6.

1 голос
/ 07 марта 2012

Что вы просто не пытаетесь получить доступ к WMI из Java? возможно с jWMI - запрос Windows WMI из Java

0 голосов
/ 29 февраля 2012

Вы можете получить MAC-адрес в Java 1.6 через java.net.NetworkInterface.

...