Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检索IP v6子网掩码长度_C#_.net_Windows 7_Registry_Ipv6 - Fatal编程技术网

C# 如何检索IP v6子网掩码长度

C# 如何检索IP v6子网掩码长度,c#,.net,windows-7,registry,ipv6,C#,.net,Windows 7,Registry,Ipv6,我正在编写一个应用程序,它必须在Windows 7计算机上获得网络适配器配置,就像在Windows网络适配器配置面板中所做的那样: 到目前为止,我几乎可以从NetworkInterface.GetAllNetworkInterfaces()获得所需的所有信息,但子网前缀长度除外 P> >我知道,它可以从C++结构代码> pMIbUnasiTaspAddisSts< 中获得,通过 OnLink预定义长度> /Cord>。 我还查看了Win32\u NetworkAdapterConfigura

我正在编写一个应用程序,它必须在Windows 7计算机上获得网络适配器配置,就像在Windows网络适配器配置面板中所做的那样:

到目前为止,我几乎可以从
NetworkInterface.GetAllNetworkInterfaces()
获得所需的所有信息,但子网前缀长度除外

<> P> >我知道,它可以从C++结构代码> pMIbUnasiTaspAddisSts< <代码>中获得,通过<代码> OnLink预定义长度> /Cord>。 我还查看了
Win32\u NetworkAdapterConfiguration
WMI类,但它似乎只返回IP v4子网掩码

我还知道注册表中有一些信息(据我所知,不是前缀长度):

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TCPIP6\Parameters\Interfaces\{CLSID}
在保存网络适配器设置时,我还使用sysinternalprocessmon尝试获取任何有用的内容,但没有找到任何内容

那么,有没有干净的.NET方法来获取这个值?(从注册表中获取不会有问题)

编辑:网关
这与实际问题无关,但对于那些需要检索整个网络适配器IPv6配置的用户来说,
IPInterfaceProperties.gatewaydreses
属性仅支持IPv4网关。正如下面的回答评论中提到的,在.NET framework 4.5之前获取整个信息的唯一方法是调用WMI。

使用参数解析netsh的输入流:

interface ipv6 show route

希望这有帮助

您可以使用Win32\u NetworkAdapter配置执行此操作。你可能忽略了它

IPSubnet将返回一个字符串数组。使用第二个值。 我没有时间编写一些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

编辑:我只是想澄清一下,以防以后有人搜索这个。第二项并不总是IPv6值。IPv4可以有多个地址和子网。在IPSubnet数组值上使用Integer.TryParse以确保它是IPv6子网和/或使用最后一项。

这可能有助于指导您,不确定是否会,但我能够从注册表中提取信息。看看这是否有帮助:正如我所说,我已经在注册表中查看了是否可以找到有用的东西,但我没有…:(好的,祝你好运,我只是想插话。另外,我相当肯定99.9%的ipv6子网前缀长度为/64。@jskiles1:嗯,我既不是IP v6,也不是网络专家,在阅读了RFC 5375 ipv6寻址注意事项后,我明白不推荐使用64以外的值。问题是,我必须开发一种提供与Windows相同的配置功能!它在IP地址的末尾显示IP v6前缀长度,这是一个进步…将与进程/文件监视器检查是否可以获取该信息并从.NET访问它,而无需解析netsh输出!我确实忽略了WMI类。将尝试此tonigth和mark这是答案。唯一的缺点是WMI不是一个性能标志,第一次调用需要花费很长时间…好吧,我写这篇文章时没有考虑速度或搜索特定对象。Foreach命令的速度效率不是很高。此外,在WMI搜索中使用WHERE语句会将其缩小到正确的网络接口。无论如何,在在我的机器上,获取所有对象需要5毫秒,遍历每个网络连接(大约15个)需要32毫秒。我认为您不必担心性能。请注意,一个设备可以有多个IPv4地址和多个IPv4子网。不能保证IPSubnet阵列中的第二个项目是IPv6子网。您可能应该在子网上执行Integer.t搜索和/或使用阵列中的最后一个项目。似乎有一些修复方法在.NET framework 4.5中,
IPInterfaceProperties.gatewaydreses
与IPv6不兼容,将只返回IPv4网关…IPv6看起来像是一个半实现的功能性…所以现在,我们将从WMIAlso获取缺少的信息。请注意,WMI不会提供有关断开连接的设备的信息!