作为我的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,没有其他虚拟适配器。
答案 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地址。