仅使用Java 6枚举MAC地址,或仅使用WMIC枚举MAC地址

时间:2012-02-29 09:11:49

标签: java windows networking wmic

作为我的Windows独家Java应用程序的一部分,我需要查询各种硬件属性 - CPU / BIOS /硬盘序列号和MAC地址。 所以我可以通过Runtime.exec调用使用WMIC和其他Windows特定工具。 查询CPU和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地址,我最接近的是this

有没有办法从Java做到这一点? 我应该补充一点,我只能使用Java 6,但我听说Java 7有更多有用的网络API。

更新:忘记添加NetworkInterface只返回IPv4以太网MAC,没有其他虚拟适配器。

3 个答案:

答案 0 :(得分:1)

我从java.net.NetworkInterface获取VPN和其他接口的MAC地址。对于所有使用命令: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(英特尔(R)82579V千兆网络连接):xx:xx:xx:xx:xx:xx&lt; - 此处的实际MAC地址
  net4(Teredo Tunneling Pseudo-Interface):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&lt; - 这里的真实MAC地址

这是使用java 7u3,但在java 6上可能有所不同。

答案 1 :(得分:1)

你有什么不尝试从java访问WMI?也许是jWMI – Query Windows WMI from Java

答案 2 :(得分:0)

您可以通过java.net.NetworkInterface在Java 1.6中获取MAC地址。