3

Javaプログラム内で、Windowsマシンのipconfig / all出力の「接続固有のDNSサフィックス」フィールドに含まれる文字列にアクセスすることは可能ですか?

例えば:

C:> ipconfig / all

イーサネットアダプタのローカルエリア接続:

    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ギガビットイーサネットなど)を返し、getInetAddresses()がこのネットワークインターフェイスにバインドされたIPアドレスのリストを提供することを知っています。

しかし、「接続固有のDNSサフィックス」を読み取る方法もありますか?

4

2 に答える 2

3

さて、私はWindowsXPとWindows7でこれを行う方法を理解しました:

  • ipconfig / allの出力にリストされている各ネットワークインターフェイスの接続固有のDNSサフィックスフィールドに含まれている文字列(例:myexample.com)は、レジストリのHKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters\Interfacesにあります。 {GUID}(GUIDは対象のネットワークインターフェイスのGUID)は、DhcpDomainという名前の文字列値(タイプREG_SZ)です。
  • WindowsレジストリキーへのアクセスはJavaでは簡単ではありませんが、リフレクションを巧妙に使用することで、HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \Interfaces\にある必要なネットワークアダプターのキーにアクセスして文字列データ要素を読み取ることができます。名前DhcpDomain; その値は必須の文字列です。
  • JavaからWindowsレジストリにアクセスする例については、次のリンクを参照してください。
于 2011-06-02T01:59:53.897 に答える
1

すべてのプラットフォームで機能する、はるかに複雑なアプローチを使用しました。

Windows 7、Ubuntu 12.04、いくつかの未知の Linux ディストリビューション (Jenkins ビルド ホスト)、および 1 台の MacBook (未知の MacOS X バージョン) でテスト済み。

常に Oracle JDK6 を使用します。他の VM ベンダーではテストされていません。

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 名の解決の失敗などのエラー処理も含まれていません。

于 2014-01-29T15:51:12.773 に答える