Как часть моего эксклюзивного 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, ни один из других виртуальных адаптеров.