【问题标题】:Change DNS in windows using c#使用 c# 在 windows 中更改 DNS
【发布时间】:2018-11-18 23:41:12
【问题描述】:

为这个混乱道歉,我几天前就开始了,我还在努力学习。 我的代码:

private void button1_Click(object sender, EventArgs e)
        {
            ManagementScope oMs = new ManagementScope();
            ObjectQuery oQuery =
                new ObjectQuery("Select * From Win32_NetworkAdapter");
            ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery);
            ManagementObjectCollection oReturnCollection = oSearcher.Get();
            foreach (ManagementObject oReturn in oReturnCollection)
            {
                if (oReturn.Properties["NetConnectionID"].Value != null)
                {
                    // I want the result from this pasted into the "Network Adapter" prompt           
                    Console.WriteLine(oReturn.Properties["NetConnectionID"].Value);
                    // This is probably 100% wrong, sorry.
                    String NetworkAdapter = Console.WriteLine(oReturn.Properties["NetConnectionID"].Value);

                    Process process = new Process();
                    process.StartInfo.FileName = "cmd.exe";
                    process.StartInfo.CreateNoWindow = true;
                    process.StartInfo.RedirectStandardInput = true;
                    process.StartInfo.RedirectStandardOutput = true;
                    process.StartInfo.UseShellExecute = false;
                    process.Start();
                    // I want to insert the Name of a network adapter into this command prompt, but I can't seem to manage it.
                    process.StandardInput.WriteLine("netsh interface ipv4 set dns "NetworkAdapter" static 8.8.8.8");
                    process.StandardInput.WriteLine("netsh interface ipv4 add dns "NetworkAdapter" 8.8.4.4 index=2");
                    process.StandardInput.Flush();
                    process.StandardInput.Close();
                    process.WaitForExit();
                    Console.WriteLine(process.StandardOutput.ReadToEnd());
                    Console.Read();
                }
            }
       }

这个想法是,当我按下按钮时,它会检测我的活动网络适配器名称并通过 cmd.exe 提示将其粘贴到标准 dns 更改中。我开始认为我让自己变得更难了。

感谢您的帮助。

【问题讨论】:

  • 要保存适配器,您所要做的就是:string adapter = oReturn.Properties["NetConnectionID"].Value;然后将其添加到 cmd 中的字符串
  • @kaj 我试过 String NetworkAdapter = oReturn.Properties["NetConnectionID"].Value;连同 process.StandardInput.WriteLine(@"netsh interface ipv4 set dns "+NetworkAdapter+" static 8.8.8.8"); process.StandardInput.WriteLine(@"netsh interface ipv4 add dns "+NetworkAdapter+" 8.8.4.4 index=2");但我得到以下信息:无法将类型“对象”隐式转换为“字符串”。存在显式转换(您是否缺少演员表?
  • 这就是您获取字符串并将其作为参数传递的方式。你的问题是什么?
  • 我似乎无法让它工作。控制台显示它只尝试运行“netsh interface ipv4 set dns”并在那里切断。所以我想我的问题是我做错了什么?
  • 看看下面的答案

标签: c# windows dns


【解决方案1】:

更改 dns 的简短版本:

首先获取网络适配器:

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["Caption"].ToString().Contains(CurrentInterface.Description))
            {
                ManagementBaseObject objdns = objMO.GetMethodParameters("SetDNSServerSearchOrder");
                if (objdns != null)
                {
                    objdns["DNSServerSearchOrder"] = Dns;
                    objMO.InvokeMethod("SetDNSServerSearchOrder", objdns, null);
                }
            }
        }
    }
}

然后使用类似的方法:

SetDNS("127.0.0.1");

取消设置 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["Caption"].ToString().Contains(CurrentInterface.Description))
            {
                ManagementBaseObject objdns = objMO.GetMethodParameters("SetDNSServerSearchOrder");
                if (objdns != null)
                {
                    objdns["DNSServerSearchOrder"] = null;
                    objMO.InvokeMethod("SetDNSServerSearchOrder", objdns, null);
                }
            }
        }
    }
}

【讨论】:

  • 非常感谢!这以比命令提示符更好的方式解决了它!再次感谢!
  • 一个快速的后续问题:要添加辅助 DNS,如 google 使用 8.8.8.8 + 8.8.4.4 - 我该如何处理?还放置 UnsetDNS();作为 button1 应该将其设置为 DHCP 吗?再次感谢!
  • 要设置辅助 DNS,您可以将一个数组传递给包含两个 ip 的方法: string[] both = { "127.0.0.1", "127.0.0.2" };或用任何标记将它们拆分,然后将其转换为如下行的数组: string[] Dns = { DnsString };这里是将字符串转换为数组,只需将其设为: string[] Dns = DnsString.Split('*');你会设置两个DNS
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2013-03-19
  • 1970-01-01
  • 2015-11-11
相关资源
最近更新 更多