如何在C#中获取当前DNS服务器?

15

如何在C#中获取当前DNS服务器?


2
你所说的“你的DNS服务器”是指本地机器的DNS服务器、你的域名的DNS服务器还是其他什么?对于“你的DNS服务器”这个问题,我的看法是有很多不同的答案。 - JB King
我正在考虑将执行Mx记录查找的不安全代码转换为安全版本。参见: http://stackoverflow.com/questions/2906615/how-to-get-around-dnsrecordlistfree-error-in-net-framework-4-0 - Greg Finzer
我想了解的是如何执行DNS查找而不必指定DNS服务器名称,即让系统使用默认值。这就是在任何时候输入URL时发生的情况,因此不确定为什么DNS类不能允许默认值。 - Brady Moritz
4个回答

16

6

最近我也试图做同样的事情,发现了罗伯特·辛达尔的这个优秀例子。

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

对于我自己来说,因为我实际上是通过PowerShell执行此操作的(在没有ipconfig等命令的地方),所以代码如下:[System.Net.NetworkInformation.NetworkInterface]::GetAllNetworkInterfaces() | ? { $_.OperationalStatus -eq [System.Net.NetworkInformation.OperationalStatus]::Up } | % { $_.GetIPProperties().DnsAddresses.IPAddress} - admalledd

0

此方法确定所有处于“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();
}

0

我添加了 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()})");
            }

        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接