Jak uzyskać unikalny identyfikator komputera w Javie (np. disk ID lub motherboard ID)?

Chciałbym uzyskać identyfikator unikalny dla komputera z Javą, na Windows, MacOS i, jeśli to możliwe, Linux. Może to być uuid dysku, Płyta główna S / N...

Runtime.getRuntime().exec może być używany(nie jest apletem).

Pomysły?
Author: Lii, 2009-12-31

11 answers

Powszechne jest używanie adresu MAC skojarzonego z kartą sieciową.

Adres jest dostępny w Javie 6 za pośrednictwem następującego API:

Java 6 Docs for Hardware Address

Nie używałem go w Javie, ale w innych aplikacjach identyfikacji sieciowej był pomocny.

 19
Author: nickk_can,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-31 19:31:51

Problem z adresem MAC polega na tym, że do komputera może być podłączonych wiele kart sieciowych. Większość najnowszych ma domyślnie dwa (wi-fi + kabel). W takiej sytuacji trzeba by wiedzieć, który adres MAC adaptera powinien być użyty. Przetestowałem rozwiązanie MAC na moim systemie, ale mam 4 adaptery (kabel, WiFi, Adapter TAP dla Virtual Box i jeden dla Bluetooth) i nie byłem w stanie zdecydować, który MAC powinienem wziąć... Jeśli ktoś zdecyduje się na użycie adaptera, który jest obecnie w użyciu (ma adresy przypisane) następnie pojawia się nowy problem, ponieważ ktoś może wziąć swój laptop i przełączyć się z adaptera kablowego na wi-fi. W takim stanie MAC przechowywany, gdy laptop był podłączony kablem, będzie teraz nieważny.

Na przykład są to adaptery, które znalazłem w moim systemie:

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

Kod, którego użyłem do ich listy:

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

Z opcji Słuchaj na tej stronie, najbardziej akceptowalny dla mnie, a ten, który użyłem w moim rozwiązaniu jest ten przez @ Ozhan Duz, drugi, podobny do @finnw odpowiedz gdzie korzystał z WMI, a warto wspomnieć com4j - sample wykorzystujące WMI jest dostępne tutaj :

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));
}

Wyświetli informacje o komputerze wraz z numerem seryjnym komputera. Należy pamiętać, że wszystkie klasy wymagane w tym przykładzie muszą być generowane przez maven-com4j-plugin. Przykładowa konfiguracja dla 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>

Powyższa konfiguracja podpowie pluginowi do generowania klas w target / generated-sources / com4j katalog w folderze projektu.

Dla tych, którzy chcieliby zobaczyć gotowe do użycia, zamieszczam linki do trzech klas, które napisałem, aby uzyskać Machine SN na Windows, Linux i Mac OS:

 42
Author: Bartosz Firyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-30 05:50:15

The OSHI projekt zapewnia niezależne od platformy narzędzia sprzętowe.

Zależność Maven:

<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>LATEST</version>
</dependency>

Na przykład, możesz użyć czegoś takiego jak poniższy kod, aby jednoznacznie zidentyfikować maszynę:

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);
    }
}

Wyjście dla mojej Maszyny:

Microsoft#57YRD12#Intel64 Family 6 Model 60 Stepping 3#8

Twoje wyjście będzie inne, ponieważ przynajmniej numer seryjny procesora będzie się różnić.

 23
Author: BullyWiiPlaza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-08 14:08:34

Co chcesz zrobić z tym unikalnym identyfikatorem? Może możesz robić co chcesz bez tego dowodu.

Adres MAC może być jedną z opcji, ale nie jest to zaufany unikalny identyfikator, ponieważ użytkownik może zmienić adres MAC komputera.

Aby sprawdzić ID płyty głównej lub procesora na tym link .

 12
Author: Pedro Ghilardi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-31 19:36:29

Tylko w systemie Windows, można uzyskać identyfikator płyty głównej za pomocą WMI , poprzez mostek COM, taki jak JACOB .

Przykład:

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();
        }
    }
}

A jeśli zdecydujesz się użyć adresu MAC do identyfikacji urządzenia, możesz użyć WMI, aby określić, czy interfejs jest podłączony przez USB (jeśli chcesz wykluczyć Adaptery USB.)

Możliwe jest również uzyskanie identyfikatora dysku twardego przez WMI, ale jest to zawodne.

 9
Author: finnw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-01 14:16:23

Należy zachować ostrożność podczas używania adresu MAC jako identyfikatora. Doświadczyłem kilku gotchas:

  1. w systemie OS X porty ethernet, które nie są aktywne/nie są wyświetlane w interfejsie sieciowym .getNetworkInterfaces () Enumeracja.
  2. szalenie łatwo jest zmienić adres MAC na kartach, jeśli masz odpowiednie uprawnienia systemu operacyjnego.
  3. Java ma zwyczaj nieprawidłowego identyfikowania" wirtualnych " interfejsów. Nawet za pomocą interfejsu sieciowego .isVirtual () nie zawsze powiem ci prawdę.

Nawet z powyższymi problemami, nadal uważam, że jest to najlepsze czyste podejście Javy do blokowania licencji sprzętowej.

 7
Author: Jason Nichols,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-01 14:32:11

Nie znając wszystkich twoich wymagań. Na przykład, czy próbujesz jednoznacznie zidentyfikować komputer ze wszystkich komputerów na świecie, czy po prostu próbujesz jednoznacznie zidentyfikować komputer z zestawu użytkowników aplikacji. Czy możesz również tworzyć pliki w systemie?

Jeśli jesteś w stanie utworzyć plik. Możesz utworzyć plik i użyć czasu utworzenia pliku jako unikalnego identyfikatora. Jeśli utworzysz go w przestrzeni użytkownika, to jednoznacznie zidentyfikuje on Użytkownika Twojej aplikacji na konkretnej maszynie. Jeśli stworzysz go gdzieś globalnie, to może on jednoznacznie zidentyfikować maszynę.

Ponownie, jak większość rzeczy, jak szybko jest wystarczająco szybko.. albo w tym przypadku, jak wyjątkowy jest wystarczająco wyjątkowy.

 6
Author: sindri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-01 17:21:24

Myślę, że powinieneś spojrzeć na ten link ... klawisz mieszany można utworzyć za pomocą kilku identyfikatory takie jak mac + os + hostname+cpu id+numer seryjny płyty głównej .

 3
Author: Michel Gokan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-01 10:22:54

Użycie MAC id jest łatwiejsze, jeśli zadanie polega na zarejestrowaniu unikalnego identyfikatora systemu.

Zmiana mac id jest jednak możliwa, nawet zmiana innych ID systemu jest również możliwa, jeśli odpowiednie urządzenie zostanie zastąpione.

Tak więc, o ile to, co dla unikalnego id jest wymagane, nie jest znane, możemy nie być w stanie znaleźć odpowiedniego rozwiązania.

Jednak poniższy link jest pomocny adresy. http://www.stratos.me/2008/07/find-mac-address-using-java/

 1
Author: Vamsy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-21 15:16:58

Do jednoznacznej identyfikacji komputera z systemem windows. Upewnij się, gdy używasz wmic, aby mieć strategię alternatywnych metod. Ponieważ "wmic bios get serialnumber" może nie działać na wszystkich komputerach, konieczne może być użycie dodatkowych metod:

# Get serial number from bios
wmic bios get serialnumber
# If previous fails, get UUID
wmic csproduct get UUID
# If previous fails, get diskdrive serialnumber
wmic DISKDRIVE get SerialNumber

Zasoby: Najlepszy Sposób Na Jednoznaczną Identyfikację Komputera Z Systemem Windows http://www.nextofwindows.com/the-best-way-to-uniquely-identify-a-windows-machine/

 1
Author: Basil Musa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-11 15:17:41

W programach java, które napisałem dla wydania, użyłem numeru seryjnego płyty głównej (który jest tym, czego używam w systemie windows); jednak działa to tylko w systemie windows, ponieważ moja funkcja tworzy tymczasowy skrypt VB, który używa WMI do pobrania wartości.

public static String getMotherboardSerial() {
      String result = "";
        try {
          File file = File.createTempFile("GetMBSerial",".vbs");
          file.deleteOnExit();
          FileWriter fw = new FileWriter(file);

          String vbs =
             "Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
            + "Set colItems = objWMIService.ExecQuery _ \n"
            + "   (\"Select * from Win32_ComputerSystemProduct\") \n"
            + "For Each objItem in colItems \n"
            + "    Wscript.Echo objItem.IdentifyingNumber \n"
            + "Next \n";

          fw.write(vbs);
          fw.close();
          Process gWMI = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
          BufferedReader input = new BufferedReader(new InputStreamReader(gWMI.getInputStream()));
          String line;
          while ((line = input.readLine()) != null) {
             result += line;
             System.out.println(line);
          }
          input.close();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        result = result.trim();
        return result;
      }
 0
Author: Charles Eddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-02 00:48:14