10

Windowsネットワークアダプターの構成パネルで行うのと同じように、Windows7マシンでネットワークアダプターの構成を取得する必要があるアプリケーションをコーディングしています。

ここに画像の説明を入力してください

NetworkInterface.GetAllNetworkInterfaces() これまでのところ、サブネットプレフィックスの長さを除いて、必要なほとんどすべての情報を取得できます。

PMIB_UNICASTIPADDRESS_TABLEを介してC++構造から取得できることは承知していますがOnLinkPrefixLength、.netにとどまろうとしています。

WMIクラスも調べましたWin32_NetworkAdapterConfigurationが、IPv4サブネットマスクしか返されないようです。

また、レジストリにいくつかの情報(私が知る限り、プレフィックスの長さではない)があることも知っています。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TCPIP6\Parameters\Interfaces\{CLSID}

また、SysInternals ProcessMonを使用して、ネットワークアダプターの設定を保存するときに役立つものを取得しようとしましたが、何も見つかりませんでした...

それで、この値を取得するためのクリーンな.NETの方法はありますか?(レジストリから取得しても問題ありません)

編集:ゲートウェイ

これは実際の質問には関係ありませんが、ネットワークアダプターのIPv6構成全体を取得する必要がある場合、IPInterfaceProperties.GatewayAdressesプロパティはIPv4ゲートウェイのみをサポートします。以下の回答コメントに記載されているように、.NET Framework 4.5までの情報全体を取得する唯一の方法は、WMIを呼び出すことです。

4

2 に答える 2

4

Win32_NetworkAdapterConfigurationを使用してこれを行うことができます。あなたはそれを見落としているかもしれません。

IPSubnetは文字列の配列を返します。2番目の値を使用します。C#コードを作成する時間がありませんでしたが、処理できると確信しています。WBEMTESTを使用して、私はこれを引き出しました:

instance of Win32_NetworkAdapterConfiguration
{
    Caption = "[00000010] Intel(R) 82579V Gigabit Network Connection";
    DatabasePath = "%SystemRoot%\\System32\\drivers\\etc";
    DefaultIPGateway = {"192.168.1.1"};
    Description = "Intel(R) 82579V Gigabit Network Connection";
    DHCPEnabled = TRUE;
    DHCPLeaseExpires = "20120808052416.000000-240";
    DHCPLeaseObtained = "20120807052416.000000-240";
    DHCPServer = "192.168.1.1";
    DNSDomainSuffixSearchOrder = {"*REDACTED*"};
    DNSEnabledForWINSResolution = FALSE;
    DNSHostName = "*REDACTED*";
    DNSServerSearchOrder = {"192.168.1.1"};
    DomainDNSRegistrationEnabled = FALSE;
    FullDNSRegistrationEnabled = TRUE;
    GatewayCostMetric = {0};
    Index = 10;
    InterfaceIndex = 12;
    IPAddress = {"192.168.1.100", "fe80::d53e:b369:629a:7f95"};
    IPConnectionMetric = 10;
    IPEnabled = TRUE;
    IPFilterSecurityEnabled = FALSE;
    IPSecPermitIPProtocols = {};
    IPSecPermitTCPPorts = {};
    IPSecPermitUDPPorts = {};
    IPSubnet = {"255.255.255.0", "64"};
    MACAddress = "*REDACTED*";
    ServiceName = "e1iexpress";
    SettingID = "{B102679F-36AD-4D80-9D3B-D18C7B8FBF24}";
    TcpipNetbiosOptions = 0;
    WINSEnableLMHostsLookup = TRUE;
    WINSScopeID = "";
};

IPSubnet [1]=IPv6サブネット;

編集:ここにいくつかのコードがあります。

StringBuilder sBuilder = new StringBuilder();
ManagementObjectCollection objects = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration").Get();
foreach (ManagementObject mObject in objects)
{
    string description = (string)mObject["Description"];
    string[] addresses = (string[])mObject["IPAddress"];
    string[] subnets = (string[])mObject["IPSubnet"];
    if (addresses == null && subnets == null)
        continue;
    sBuilder.AppendLine(description);
    sBuilder.AppendLine(string.Empty.PadRight(description.Length,'-'));
    if (addresses != null)
    {
        sBuilder.Append("IPv4 Address: ");
        sBuilder.AppendLine(addresses[0]);
        if (addresses.Length > 1)
        {
            sBuilder.Append("IPv6 Address: ");
            sBuilder.AppendLine(addresses[1]);
        }
    }
    if (subnets != null)
    {
        sBuilder.Append("IPv4 Subnet:  ");
        sBuilder.AppendLine(subnets[0]);
        if (subnets.Length > 1)
        {
            sBuilder.Append("IPv6 Subnet:  ");
            sBuilder.AppendLine(subnets[1]);
        }
    }
    sBuilder.AppendLine();
    sBuilder.AppendLine();
}
string output = sBuilder.ToString().Trim();
MessageBox.Show(output);

およびいくつかの出力:

Intel(R) 82579V Gigabit Network Connection
------------------------------------------
IPv4 Address: 192.168.1.100
IPv6 Address: fe80::d53e:b369:629a:7f95
IPv4 Subnet:  255.255.255.0
IPv6 Subnet:  64

編集:誰かが後でこれを検索する場合に備えて、明確にするつもりです。2番目の項目は、必ずしもIPv6値であるとは限りません。IPv4は、複数のアドレスとサブネットを持つことができます。IPSubnet配列値でInteger.TryParseを使用して、それがIPv6サブネットであることを確認するか、最後の項目を使用します。

于 2012-08-07T18:08:06.310 に答える
1

引数を使用してnetshの入力ストリームを解析します。

interface ipv6 show route

お役に立てれば!

于 2012-08-07T16:13:08.107 に答える