10

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

在此处输入图像描述

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

我知道可以通过 C++ struc 检索它,PMIB_UNICASTIPADDRESS_TABLEOnLinkPrefixLength我试图留在.net 中。

我还查看了Win32_NetworkAdapterConfigurationWMI 类,但它似乎只返回 IP v4 子网掩码。

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

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

我还使用 SysInternals ProcessMon 来尝试在保存网络适配器设置时获得任何有用的东西,但什么也没找到......

那么,是否有任何干净的 .NET 方法来获取此值?(从注册表中获取它不会有问题)

编辑:网关

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

4

2 回答 2

4

您可以使用 Win32_NetworkAdapterConfiguration 执行此操作。你可能忽略了它。

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 子网和/或使用最后一项。

于 2012-08-07T18:08:06.310 回答
1

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

interface ipv6 show route

希望这可以帮助!

于 2012-08-07T16:13:08.107 回答