如何在Java中获取唯一的计算机标识符(如磁盘ID或主板ID)?
我想获得一个带有Java的计算机的唯一ID,在Windows,MacOS上,如果可能的话,在Linux上。它可能是磁盘UUID,主板S / N...
Runtime.getRuntime().exec
可以使用(它不是小程序)。
想法?
我想获得一个带有Java的计算机的唯一ID,在Windows,MacOS上,如果可能的话,在Linux上。它可能是磁盘UUID,主板S / N...
Runtime.getRuntime().exec
可以使用(它不是小程序)。
想法?
MAC地址的问题在于可能有许多网络适配器连接到计算机。默认情况下,大多数最新的都有两个(Wi-Fi +电缆)。在这种情况下,必须知道应该使用哪个适配器的MAC地址。我在我的系统上测试了MAC解决方案,但我有4个适配器(电缆,WiFi,虚拟盒的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());
}
从此页面上的选项中,对我来说最可接受的,我在我的解决方案中使用的是@Ozhan Duz,另一个类似于他使用JACOB的@finnw答案,值得一提的是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>
上面的配置将告诉插件在项目文件夹中的目标/生成源/com4j目录中生成类。
对于那些希望看到即用型解决方案的人,我包括了我写的三个类的链接,以便在Windows,Linux和Mac OS上获得机器SN:
OSHI
项目提供独立于平台的硬件实用程序。
Maven dependency:
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>LATEST</version>
</dependency>
例如,您可以使用类似于以下代码的内容来唯一地标识计算机:
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.ComputerSystem;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.software.os.OperatingSystem;
class ComputerIdentifier
{
static String generateLicenseKey()
{
SystemInfo systemInfo = new SystemInfo();
OperatingSystem operatingSystem = systemInfo.getOperatingSystem();
HardwareAbstractionLayer hardwareAbstractionLayer = systemInfo.getHardware();
CentralProcessor centralProcessor = hardwareAbstractionLayer.getProcessor();
ComputerSystem computerSystem = hardwareAbstractionLayer.getComputerSystem();
String vendor = operatingSystem.getManufacturer();
String processorSerialNumber = computerSystem.getSerialNumber();
String processorIdentifier = centralProcessor.getIdentifier();
int processors = centralProcessor.getLogicalProcessorCount();
String delimiter = "#";
return vendor +
delimiter +
processorSerialNumber +
delimiter +
processorIdentifier +
delimiter +
processors;
}
public static void main(String[] arguments)
{
String identifier = generateLicenseKey();
System.out.println(identifier);
}
}
我的机器的输出:
Microsoft#57YRD12#Intel64 Family 6 Model 60 Stepping 3#8
您的输出将有所不同,因为至少处理器序列号会有所不同。