Как мне получить доступ к DNS-суффиксу конкретного соединения для каждого NetworkInterface в Java?

Возможно ли в программе Java получить доступ к строке, содержащейся в поле «DNS-суффикс для конкретного соединения» в выводе ipconfig / all машины Windows?

Eg:

C:> ipconfig / все

Подключение по локальной сети адаптера Ethernet:

    Connection-specific DNS Suffix  . : myexample.com  <======== This string
    Description . . . . . . . . . . . : Broadcom NetXtreme Gigabit Ethernet
    Physical Address. . . . . . . . . : 00-30-1B-B2-77-FF
    Dhcp Enabled. . . . . . . . . . . : Yes
    Autoconfiguration Enabled . . . . : Yes
    IP Address. . . . . . . . . . . . : 192.168.1.66
    Subnet Mask . . . . . . . . . . . : 255.255.255.0

Я знаю, что getDisplayName () вернет описание (например, Broadcom NetXtreme Gigabit Ethernet выше) и что getInetAddresses () предоставит мне список IP-адресов, привязанных к этому сетевому интерфейсу.

Но есть ли еще способы чтения «DNS-суффикса для конкретного подключения»?


person arjunaw    schedule 26.05.2011    source источник


Ответы (2)


Итак, я понял, как это сделать в Windows XP и Windows 7:

  • Строку (например: myexample.com), содержащуюся в поле DNS-суффикса для конкретного подключения каждого сетевого интерфейса, указанного в выводе ipconfig / all, можно найти в реестре по адресу HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces {GUID} (где GUID - это GUID интересующего сетевого интерфейса) как строковое значение (тип REG_SZ) с именем DhcpDomain.
  • Доступ к разделам реестра Windows в Java не является простым, но с помощью некоторого умного использования отражения можно получить доступ к требуемому ключу сетевого адаптера, находящемуся в HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ Interfaces \, а затем прочитать элемент строковых данных с помощью name DhcpDomain; его значение - обязательная строка.
  • See the following links for examples of accessing the windows registry from Java:
person arjunaw    schedule 02.06.2011

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

Протестировано в Windows 7, Ubuntu 12.04 и некоторых неизвестных дистрибутивах Linux (хосты сборки Jenkins) и на одном MacBook (неизвестная версия MacOS X).

Всегда с Oracle JDK6. Никогда не тестировался с другими поставщиками виртуальных машин.

String findDnsSuffix() {

// First I get the hosts name
// This one never contains the DNS suffix (Don't know if that is the case for all VM vendors)
String hostName = InetAddress.getLocalHost().getHostName().toLowerCase();

// Alsways convert host names to lower case. Host names are 
// case insensitive and I want to simplify comparison.

// Then I iterate over all network adapters that might be of interest
Enumeration<NetworkInterface> ifs = NetworkInterface.getNetworkInterfaces();

if (ifs == null) return ""; // Might be null

for (NetworkInterface iF : Collections.list(ifs)) { // convert enumeration to list.
    if (!iF.isUp()) continue;

    for (InetAddress address : Collections.list(iF.getInetAddresses())) {
        if (address.isMulticastAddress()) continue;

        // This name typically contains the DNS suffix. Again, at least on Oracle JDK
        String name = address.getHostName().toLowerCase();

        if (name.startsWith(hostName)) {
            String dnsSuffix = name.substring(hostName.length());
            if (dnsSuffix.startsWith(".")) return dnsSuffix;
        }
    }
}

return "";
}

Примечание: я написал код в редакторе, а не копировал реально используемое решение. Он также не содержит обработки ошибок, таких как компьютеры без имени, невозможность разрешить DNS-имя, ...

person AndiHofi    schedule 29.01.2014
comment
Это довольно поздно, но можете ли вы объяснить, каков именно результат для вас в Windows 10. Очень похожий код работает в производственной среде годами, и он всегда работал. Также на Windows 10. Хотя могут быть ошибки. - person AndiHofi; 22.10.2018