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[] { });