如何检索IP v6的子网掩码长度 [英] how to retrieve IP v6 subnet mask length

查看:674
本文介绍了如何检索IP v6的子网掩码长度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的编码,有,我的Windows 7机器上的网络适配器配置,就像它在Windows网络适配器配置面板做了一个应用程序:

到目前为止,我可以得到pretty的太多,我需要从信息NetworkInterface.GetAllNetworkInterfaces() 除了子网preFIX长度

我知道,它可以从C检索++ STRUC PMIB_UNICASTIPADDRESS_TABLE 通过 OnLink prefixLength 但我想留在.NET。

我还拿了一看 Win32_NetworkAdapterConfiguration的 WMI类,但它似乎只返回IP v4的子网掩码。

我也知道一些信息(而不是preFIX长,据我所知)都是在注册表中的:

<$p$p><$c$c>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TCPIP6\Parameters\Interfaces\{CLSID}

我还使用Sysinternals的ProcessMon尽量节省网络适配器设置时得到任何有用的却一无所获......

那么,有没有干净的.NET的方式来获得这个值? (从注册表得到它不会成为一个问题)

编辑:网关

这不涉及实际的问题,但对于那些谁需要检索整个网络适配器的IPv6配置, IPInterfaceProperties.GatewayAdresses 属性仅支持IPv4的网关。正如mentionned在下面的答案意见,只有这样,才能让整个信息直到.NET框架4.5是调用WMI。

解决方案

您可以这样做使用Win32_NetworkAdapterConfiguration的。你可能会忽略它。

IPSubnet会返回一个字符串数组。使用第二个值。 我没有时间掀起一些C#code,但我敢肯定,你可以处理它。使用WBEMTEST,我把这样的:

  Win32_NetworkAdapterConfiguration的实例
{
    标题=[00000010]英特尔(R)82579V千兆网络连接;
    DatabasePath =%SYSTEMROOT%\\ System32下\\ \\司机等;
    DefaultIPGateway = {192.168.1.1};
    说明=英特尔(R)82579V千兆网络连接;
    DHCPEnabled相= TRUE;
    DHCPLeaseExpires =20120808052416.000000-240;
    DHCPLeaseObtained =20120807052416.000000-240;
    DHCPSERVER =192.168.1.1;
    确保DNSDomainSuffixSearchOrder = {*绝密*};
    DNSEnabledForWINSResolution = FALSE;
    DNSHOSTNAME =*绝密*;
    DNSServerSearchOrder的= {192.168.1.1};
    与DomainDNSRegistrationEnabled = FALSE;
    FullDNSRegistrationEnabled = TRUE;
    GatewayCostMetric = {0};
    指数= 10;
    InterfaceIndex = 12;
    ip地址= {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 =*绝密*;
    服务名称=e1iex preSS;
    SettingID ={B102679F-36AD-4D80-9D3B-D18C7B8FBF24};
    的TcpipNetbiosOptions = 0;
    WINSEnableLMHostsLookup = TRUE;
    WINSScopeID =;
};
 

IPSubnet [1] = IPv6子网;

编辑:下面是一些code

  StringBuilder的sBuilder =新的StringBuilder();
ManagementObjectCollection对象=新ManagementObjectSearcher(SELECT * FROM Win32_NetworkAdapterConfiguration的)获得()。
的foreach(的ManagementObject mObject中的对象)
{
    字符串描述=(字符串)mObject [说明]。
    字符串[]地址=(字符串[])mObject [ip地址];
    字符串[]子网=(字符串[])mObject [IPSubnet];
    如果(地址== NULL和放大器;&安培;子网== NULL)
        继续;
    sBuilder.AppendLine(介绍);
    sBuilder.AppendLine(string.Empty.PadRight(description.Length,' - '));
    如果(地址!= NULL)
    {
        sBuilder.Append(IPv4地址);
        sBuilder.AppendLine(地址[0]);
        如果(addresses.Length→1)
        {
            sBuilder.Append(IPv6地址);
            sBuilder.AppendLine(地址[1]);
        }
    }
    如果(子网!= NULL)
    {
        sBuilder.Append(的IPv4子网);
        sBuilder.AppendLine(子网[0]);
        如果(subnets.Length→1)
        {
            sBuilder.Append(IPv6子网:);
            sBuilder.AppendLine(子网[1]);
        }
    }
    sBuilder.AppendLine();
    sBuilder.AppendLine();
}
字符串输出= sBuilder.ToString()修剪()。
的MessageBox.show(输出);
 

和一些输出:

 英特尔(R)82579V千兆网络连接
------------------------------------------
IPv4地址:192.168.1.100
IPv6的地址:FE80 :: d53e:B369:629A:7f95
IPv4的子网:255.255.255.0
IPv6子网:64
 

编辑:我只是要澄清的情况下,此人后来搜索。第二项是并不总是IPv6的值。 IPv4的可以有多个地址和子网。使用Integer.TryParse在IPSubnet阵列值,以确保它是一个IPv6子网和/或使用的最后一个项目。

I'm coding an application that has to get the network adapters configuration on a Windows 7 machine just like it's done in the Windows network adapters configuration panel:

So far I can get pretty much all the information I need from NetworkInterface.GetAllNetworkInterfaces() EXCEPT the subnet prefix length.

I'm aware that it can be retrieved from the C++ struc PMIB_UNICASTIPADDRESS_TABLE via OnLinkPrefixLength but I'm trying to stay in .net.

I also took a look at the Win32_NetworkAdapterConfiguration WMI class but it only seems to return the IP v4 subnet mask.

I also know that some information (not the prefix length, as far as I know) are in the registry:

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

I also used SysInternals ProcessMon to try to get anything usefull when saving the network adapter settings but found nothing...

So, is there any clean .NET way to get this value? (getting it from the registry wouldn't be a problem)

EDIT: Gateways

This doesn't concern the actual question, but for those who need to retrieve the entire network adapter IPv6 configuration, the IPInterfaceProperties.GatewayAdresses property only supports the IPv4 gateways. As mentionned in the answer comments below, the only way to get the entire info until .NET framework 4.5 is to call WMI.

解决方案

You can do so using Win32_NetworkAdapterConfiguration. You might have overlooked it.

IPSubnet will return an array of strings. Use the second value. I didn't have time to whip up some C# code, but I'm sure you can handle it. Using WBEMTEST, I pulled this:

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 subnet;

Edit: Here's some code.

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

and some 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

Edit: I'm just going to clarify in case somebody searches for this later. The second item isn't always the IPv6 value. IPv4 can have multiple addresses and subnets. Use Integer.TryParse on the IPSubnet array value to make sure it's an IPv6 subnet and/or use the last item.

这篇关于如何检索IP v6的子网掩码长度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆