Как получить уникальный компьютерный идентификатор в Java (как дисковый идентификатор или идентификатор материнской платы)?

Я хотел бы получить идентификатор, уникальный для компьютера с Java, в Windows, MacOS и, если это возможно, Linux. Это мог быть диск UUID, материнская плата S/N...

Runtime.getRuntime().exec может использоваться (это не апплет).

Идеи?

60
задан Lii 26 April 2018 в 08:56
поделиться

6 ответов

Обычно MAC-адрес ассоциируется с сетевой картой.

Адрес доступен на Java 6 через следующий API:

Java 6 Docs for Hardware Address

Я не использовал его на Java, но для других приложений для сетевой идентификации он был полезен.

19
ответ дан 24 November 2019 в 17:40
поделиться

Что вы хотите сделать с этим уникальным идентификатором? Может быть, вы можете делать все, что хотите без этого идентификатора.

MAC-адрес может быть одним из вариантов, но это не доверенный уникальный идентификатор, потому что пользователь может изменить MAC-адрес компьютера.

Чтобы получить ID материнской платы или процессора, проверьте эту ссылку.

.
12
ответ дан 24 November 2019 в 17:40
поделиться

Будьте осторожны при использовании MAC-адреса в качестве идентификатора. Я сталкивался с несколькими ошибками:

  1. На операционной системе X неактивные/неактивные ethernet-порты не отображаются в перечислении NetworkInterface.getNetworkInterfaces().
  2. Изменять MAC-адрес на картах безумно просто, если у вас есть соответствующие привилегии операционной системы.
  3. Java имеет привычку некорректно идентифицировать "виртуальные" интерфейсы. Даже использование NetworkInterface.isVirtual() не всегда говорит правду.

Даже с вышеупомянутыми проблемами, я все еще думаю, что это лучший чистый Java подход к аппаратной блокировке лицензии.

.
7
ответ дан 24 November 2019 в 17:40
поделиться

Только для Windows можно получить идентификатор материнской платы, используя WMI, через COM-мост, например JACOB.

Пример:

import java.util.Enumeration;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.EnumVariant;
import com.jacob.com.Variant;

public class Test {
    public static void main(String[] args) {
        ComThread.InitMTA();
        try {
            ActiveXComponent wmi = new ActiveXComponent("winmgmts:\\\\.");
            Variant instances = wmi.invoke("InstancesOf", "Win32_BaseBoard");
            Enumeration<Variant> en = new EnumVariant(instances.getDispatch());
            while (en.hasMoreElements())
            {
                ActiveXComponent bb = new ActiveXComponent(en.nextElement().getDispatch());
                System.out.println(bb.getPropertyAsString("SerialNumber"));
                break;
            }
        } finally {
            ComThread.Release();
        }
    }
}

И если вы решили использовать MAC-адрес для идентификации машины, вы можете использовать WMI для определения того, подключен ли интерфейс через USB (если вы хотите исключить USB-адаптеры)

Также можно получить идентификатор жесткого диска через WMI, но это ненадежно.

.
9
ответ дан 24 November 2019 в 17:40
поделиться

Думаю, вам стоит взглянуть на эту ссылку ... вы можете сделать смешанную клавишу, используя несколько такие идентификаторы, как mac+os+hostname+cpu id+серийный номер материнской платы.

3
ответ дан 24 November 2019 в 17:40
поделиться

Незнание всех ваших требований. Например, вы пытаетесь однозначно идентифицировать компьютер среди всех компьютеров в мире, или вы просто пытаетесь однозначно идентифицировать компьютер среди группы пользователей вашего приложения. Кроме того, можете ли вы создавать файлы в системе?

Если вы можете создать файл. Вы можете создать файл и использовать время создания файла в качестве своего уникального идентификатора. Если вы создадите его в пространстве пользователя, он будет однозначно идентифицировать пользователя вашего приложения на конкретном компьютере. Если вы создали его где-то в глобальном масштабе, он может однозначно идентифицировать машину.

Опять же, как и большинство вещей, насколько быстро достаточно быстро ... или, в данном случае, насколько уникально достаточно уникально.

6
ответ дан 24 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: