如何在C#中获取当前DNS服务器?
如何在C#中获取当前DNS服务器?
最近我也试图做同样的事情,发现了罗伯特·辛达尔的这个优秀例子。
using System;
using System.Net;
using System.Net.NetworkInformation;
namespace HowToGetLocalDnsServerAddressConsoleApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(GetDnsAdress());
Console.ReadKey();
}
private static IPAddress GetDnsAdress()
{
NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface networkInterface in networkInterfaces)
{
if (networkInterface.OperationalStatus == OperationalStatus.Up)
{
IPInterfaceProperties ipProperties = networkInterface.GetIPProperties();
IPAddressCollection dnsAddresses = ipProperties.DnsAddresses;
foreach (IPAddress dnsAdress in dnsAddresses)
{
return dnsAdress;
}
}
}
throw new InvalidOperationException("Unable to find DNS Address");
}
}
}
[System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() | ? { $_.OperationalStatus -eq [System.Net.NetworkInformation.OperationalStatus]::Up } | % { $_.GetIPProperties().DnsAddresses.IPAddress}
- admalledd此方法确定所有处于“up”状态的接口上配置的DNS服务器地址。它允许选择是否需要IPv4和/或IPv6地址。
using System.Net.NetworkInformation;
using System.Net.Sockets;
public static IPAddress[] GetDnsAdresses(bool ip4Wanted, bool ip6Wanted)
{
NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
HashSet<IPAddress> dnsAddresses = new HashSet<IPAddress>();
foreach (NetworkInterface networkInterface in interfaces)
{
if (networkInterface.OperationalStatus == OperationalStatus.Up)
{
IPInterfaceProperties ipProperties = networkInterface.GetIPProperties();
foreach (IPAddress forAddress in ipProperties.DnsAddresses)
{
if ((ip4Wanted && forAddress.AddressFamily == AddressFamily.InterNetwork) || (ip6Wanted && forAddress.AddressFamily == AddressFamily.InterNetworkV6))
{
dnsAddresses.Add(forAddress);
}
}
}
}
return dnsAddresses.ToArray();
}
我添加了 IPHostEntry,以防您想要获取一些额外的数据,比如名称,而不仅仅是 DNS 服务器地址。
NetworkInterface ni = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(ni => ni.NetworkInterfaceType != NetworkInterfaceType.Loopback&&ni.OperationalStatus== OperationalStatus.Up);
if (ni.GetIPProperties().IsDynamicDnsEnabled|| ni.GetIPProperties().IsDnsEnabled)
{
var dnsServer = ni.GetIPProperties().DnsAddresses;
foreach (var dns in dnsServer)
{
IPHostEntry hostInfo = Dns.GetHostEntry(dns);
Console.WriteLine($"DNS server: {dns.ToString()} ({hostInfo.HostName.ToString()})");
}
}