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

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

Например:

C:> ipconfig / all

Адаптер 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-суффикса для конкретного соединения»?

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

Хорошо, поэтому я выяснил, как это сделать в 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 \, а затем прочитайте строковый элемент данных с именем DhcpDomain;его значение является обязательной строкой.
  • См. следующие ссылки для примеров доступа к реестру Windows из Java:
0 голосов
/ 29 января 2014

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

Протестировано в 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-имени, ...

...