C# 通过修改注册表修改网络接口的IPv6的DNS服务器地址

我又傻逼了,一开始把注册表其中一个路径搞错了应该是CurrentControlSet而不是ControlSet001,虽然内容都一样,但并不是所有电脑上都有ControlSet001也可能是ControlSet002等等

具体可以参考链接

https://docs.microsoft.com/en-us/troubleshoot/windows-client/networking/tcpip-and-nbt-configuration-parameters#how-to-change-parameters

https://stackoverflow.com/questions/291519/how-does-currentcontrolset-differ-from-controlset001-and-controlset002 

 

 警告:以这种方式修改后可能需要运行如下命令才会生效

 

ipconfig /renew
ipconfig /renew6

 

windows 10 可以使用如下PowerShell命令来安全的更改IPv4与IPv6的DNS服务器地址

Get-NetAdapter -Name * | Set-DnsClientServerAddress -ServerAddresses ('127.0.0.1','::1')

恢复为自动获取

Get-NetAdapter -Name * | Set-DnsClientServerAddress -ResetServerAddresses

 

 

 

注册表路径为

计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\Interfaces\接口GUID

接口GUID可以通过下面的程序获得,至于用哪一个根据需求选择,我只筛选出了以太网和WIFI

var vs = NetworkInterface.GetAllNetworkInterfaces()
                .Where(p => p.NetworkInterfaceType == NetworkInterfaceType.Ethernet || p.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
                .Select(p => p.Id)
                .ToArray();

然后把相应路径下NameServer值的数据设置为需要的IP就可以了

 

 

 

也可以通过下面的代码来进行设置,思路是先通过注册表修改IPv6地址,然后通过WIM修改IPv4地址,这样IPv6的更改也会被刷新(貌似)

 

public static class SetDnsServerAddress
    {

        static void SetIPv6(string guidID, IPAddress[] dnsIPs)
        {

            var vs = new string[] { "SYSTEM", "CurrentControlSet", "Services", "Tcpip6", "Parameters", "Interfaces", guidID };
            var path = string.Join(@"\", vs);

            var reg = Registry.LocalMachine.OpenSubKey(path, true);

            reg.SetValue("NameServer", string.Join<IPAddress>(",", dnsIPs));
        }


        static void SetIPv4(string guidID, IPAddress[] dnsIPs)
        {
            ManagementObject[] GetInstances()
            {
                return (new ManagementClass("Win32_NetworkAdapterConfiguration"))
                    .GetInstances()
                    .Cast<ManagementObject>()
                    .Where(mo => mo["SettingID"].ToString().Equals(guidID))
                    .ToArray();
            }

            foreach (ManagementObject objMO in GetInstances())
            {
                ManagementBaseObject objdns = objMO.GetMethodParameters("SetDNSServerSearchOrder");

                var dnsvs = dnsIPs.Select(p => p.ToString()).ToArray();

                objdns["DNSServerSearchOrder"] = dnsvs;

                objMO.InvokeMethod("SetDNSServerSearchOrder", objdns, null);
            }
        }




        public static void Set(string[] guidIDs, IPAddress[] dnsIPs)
        {
            var ipv4 = dnsIPs.Where(p => p.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();

            var ipv6 = dnsIPs.Where(p => p.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6).ToArray();



            foreach (var guid in guidIDs)
            {
                SetIPv6(guid, ipv6);

                SetIPv4(guid, ipv4);
            }
        }
    }

可以这样使用

public static string[] GetActiveEthernetOrWifiNetworkInterface()
{
return NetworkInterface.GetAllNetworkInterfaces()
.Where(a => a.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || a.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
.Select(p => p.Id)
.ToArray();
}


//设置

            SetDnsServerAddress.Set(GetActiveEthernetOrWifiNetworkInterface(), new IPAddress[] { IPAddress.Loopback, IPAddress.IPv6Loopback });
//还原自动获取

            SetDnsServerAddress.Set(GetActiveEthernetOrWifiNetworkInterface(), new IPAddress[] { });

 

posted @ 2021-12-05 17:12  FfD4edyo  阅读(495)  评论(0)    收藏  举报