Phi*_*lac 10 .net c# registry ipv6 windows-7
我正在编写一个必须在Windows 7计算机上获得网络适配器配置的应用程序,就像在Windows网络适配器配置面板中完成的那样:

到目前为止,NetworkInterface.GetAllNetworkInterfaces() 除了子网前缀长度之外,我几乎可以获得所需的所有信息.
我知道,它可以从C++ STRUC检索PMIB_UNICASTIPADDRESS_TABLE通过OnLinkPrefixLength,但我想留在.NET.
我还看了一下Win32_NetworkAdapterConfigurationWMI类,但它似乎只返回了IP v4子网掩码.
我也知道一些信息(不是前缀长度,据我所知)在注册表中:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TCPIP6\Parameters\Interfaces\{CLSID}
Run Code Online (Sandbox Code Playgroud)
我还使用SysInternals ProcessMon尝试在保存网络适配器设置时获得任何有用的东西但却一无所获......
那么,有没有什么干净的.NET方法来获得这个价值?(从注册表中获取它不会有问题)
这与实际问题无关,但对于需要检索整个网络适配器IPv6配置的用户,该IPInterfaceProperties.GatewayAdresses属性仅支持IPv4网关.正如下面的答案评论中提到的,在.NET Framework 4.5之前获取整个信息的唯一方法是调用WMI.
您可以使用 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 = "";
};
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
和一些输出:
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
Run Code Online (Sandbox Code Playgroud)
编辑:我只是想澄清一下,以防有人稍后搜索此内容。第二项并不总是 IPv6 值。IPv4 可以有多个地址和子网。对 IPSubnet 数组值使用 Integer.TryParse 以确保它是 IPv6 子网和/或使用最后一项。