c# - 如何在 Windows 10 上使用 C# 更改 DNS

标签 c# dns

我正在尝试通过 VB.NET 更改 Windows 10 上的 DNS。

我有适用于 Windows 7 的代码,但不适用于 Windows 10。

这是我的更改 DNS 的 Windows 7 代码:

ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
    if ((bool)mo["IPEnabled"])
    {
        ManagementBaseObject objdns = mo.GetMethodParameters("SetDNSServerSearchOrder");
        if (objdns != null)
        {
            string[] s = { "192.168.XX.X", "XXX.XX.X.XX" };
            objdns["DNSServerSearchOrder"] = s;
            mo.InvokeMethod("SetDNSServerSearchOrder", objdns, null);

我的问题是,如何让它在 Windows 10 操作系统上运行?

最佳答案

首先你需要获取你想要设置/取消设置 DNS 的网络接口(interface)

我已经在最新版本的 Windows 10 上测试了这段代码,它运行得非常棒!

这是查找事件以太网或 Wifi 网络的代码(不是 100% 准确但在大多数情况下有用)

public static NetworkInterface GetActiveEthernetOrWifiNetworkInterface()
{
    var Nic = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(
        a => a.OperationalStatus == OperationalStatus.Up &&
        (a.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || a.NetworkInterfaceType == NetworkInterfaceType.Ethernet) &&
        a.GetIPProperties().GatewayAddresses.Any(g => g.Address.AddressFamily.ToString() == "InterNetwork"));

    return Nic;
}

设置DNS

public static void SetDNS(string DnsString)
{
    string[] Dns = { DnsString };
    var CurrentInterface = GetActiveEthernetOrWifiNetworkInterface();
    if (CurrentInterface == null) return;

    ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection objMOC = objMC.GetInstances();
    foreach (ManagementObject objMO in objMOC)
    {
        if ((bool)objMO["IPEnabled"])
        {
            if (objMO["Description"].ToString().Equals(CurrentInterface.Description))
            {
                ManagementBaseObject objdns = objMO.GetMethodParameters("SetDNSServerSearchOrder");
                if (objdns != null)
                {
                    objdns["DNSServerSearchOrder"] = Dns;
                    objMO.InvokeMethod("SetDNSServerSearchOrder", objdns, null);
                }
            }
        }
    }
}

取消设置 DNS

public static void UnsetDNS()
{
    var CurrentInterface = GetActiveEthernetOrWifiNetworkInterface();
        if (CurrentInterface == null) return;

    ManagementClass objMC = new ManagementClass("Win32_NetworkAdapterConfiguration");
    ManagementObjectCollection objMOC = objMC.GetInstances();
    foreach (ManagementObject objMO in objMOC)
    {
        if ((bool)objMO["IPEnabled"])
        {
            if (objMO["Description"].ToString().Equals(CurrentInterface.Description))
            {
                ManagementBaseObject objdns = objMO.GetMethodParameters("SetDNSServerSearchOrder");
                if (objdns != null)
                {
                    objdns["DNSServerSearchOrder"] = null;
                    objMO.InvokeMethod("SetDNSServerSearchOrder", objdns, null);
                }
            }
        }
    }
}

用法

SetDNS("127.0.0.1");

关于c# - 如何在 Windows 10 上使用 C# 更改 DNS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40291375/

相关文章:

javascript - 修复无效 JSON 的最有效方法

string - 如何从 URL 中提取域

apache - DNS 错误 : Loading from master file failed:

linux - 在 weblogic 11g 中设置首选监听地址

mongodb - 使用Grails和MongoDB的Web爬网程序的示例域类?

dns - 缓存名称服务器是否通常缓存否定的 DNS 响应 SERVFAIL

c# - Windows 手机 8 : Load png from gallery

c# - 使用 C# 或任何开源文本挖掘 API 从文本文件中分离出有意义的词

c# - Web 作业可以处理队列存储消息的最大速率是多少?

c# - 验证 SaveFileDialog 的 InitialDirectory?