0

作为我的 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 地址。我见过的最接近的是this,用于 IP 地址。

有没有办法从Java做到这一点?我应该补充一点,我仅限于使用 Java 6,尽管我听说 Java 7 有更多有用的网络 API。

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

4

3 回答 3

1

我从中获取 VPN 和其他接口的 MAC 地址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 地址
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 <- a real MAC地址在这里

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

于 2012-03-03T23:57:06.117 回答
1

您不只是尝试从 java 访问 WMI 吗?也许使用jWMI – 从 Java 查询 Windows WMI

于 2012-03-07T04:57:41.350 回答
0

你可以在 Java 1.6 中通过java.net.NetworkInterface.

于 2012-02-29T09:20:44.740 回答