如何在Java中获得唯一的计算机标识符(如磁盘ID或主板id)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我希望得到一个在Java,Windows,MacOS以及Linux(如果可能)的计算机上唯一的id。它可能是一个磁盘UUID,主板s / n ...

Runtime.getRuntime().exec 可以使用(它不是一个小程序)。

提问于
用户回答回答于

通常使用的MAC地址是与网卡相关联的。

通过以下API可以在Java 6中获得地址:

用于硬件地址的Java 6文档

我还没有在Java中使用过它,但是对于其他网络标识应用程序来说,它是很有帮助的。

用户回答回答于

MAC地址的问题是可能有许多网络适配器连接到计算机。大多数最新的有两个默认(Wi-Fi +电缆)。在这种情况下,必须知道应该使用哪个适配器的MAC地址。我在我的系统上测试了MAC解决方案,但我有4个适配器(电缆,WiFi,适用于Virtual Box的TAP适配器和一个适用于蓝牙的适配器),我无法决定应采用哪个MAC ...如果有人决定使用适配器当前正在使用(已分配地址),则会出现新问题,因为有人可以拿起他/她的笔记本电脑并从电缆适配器切换到Wi-Fi。当通过电缆连接笔记本电脑时存储这种情况的MAC现在将失效。

例如,那些是我在我的系统中找到的适配器:

lo MS TCP Loopback interface
eth0 Intel(R) Centrino(R) Advanced-N 6205
eth1 Intel(R) 82579LM Gigabit Network Connection
eth2 VirtualBox Host-Only Ethernet Adapter
eth3 Sterownik serwera dostepu do sieci LAN Bluetooth

我用来列出它们的代码:

Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces();
while (nis.hasMoreElements()) {
    NetworkInterface ni = nis.nextElement();
    System.out.println(ni.getName() + " " + ni.getDisplayName());
}

从这个页面上的选项中选择listen,这对我来说是最可以接受的,而我在解决方案中使用的是@Ozhan Duz,另一个方案,他使用JACOB,值得一提的是com4j - 使用WMI的示例可在此处获得

ISWbemLocator wbemLocator = ClassFactory.createSWbemLocator();
ISWbemServices wbemServices = wbemLocator.connectServer("localhost","Root\\CIMv2","","","","",0,null);
ISWbemObjectSet result = wbemServices.execQuery("Select * from Win32_SystemEnclosure","WQL",16,null);
for(Com4jObject obj : result) {
    ISWbemObject wo = obj.queryInterface(ISWbemObject.class);
    System.out.println(wo.getObjectText_(0));
}

这将打印一些计算机信息和计算机序列号。请注意,本示例所需的所有类必须由maven-com4j-plugin生成。maven-com4j-plugin的配置示例:

<plugin>
    <groupId>org.jvnet.com4j</groupId>
    <artifactId>maven-com4j-plugin</artifactId>
    <version>1.0</version>
    <configuration>
        <libId>565783C6-CB41-11D1-8B02-00600806D9B6</libId>
        <package>win.wmi</package>
        <outputDirectory>${project.build.directory}/generated-sources/com4j</outputDirectory>
    </configuration>
    <executions>
        <execution>
            <id>generate-wmi-bridge</id>
            <goals>
                <goal>gen</goal>
            </goals>
        </execution>
    </executions>
</plugin>

上面的配置会告诉插件在项目文件夹的target / generated-sources / com4j目录中生成类。

扫码关注云+社区