Change DNS with script

30

17

I need to frequently change the DNS server address, and for now I do it by opening 'network and sharing center' - 'local area connection' - properties - ipv4 - and then type the DNS numbers.

Is there a faster way to do it? Can I do it with a batch file or a powershell script? Is there a built in console command to change DNS?

Endy Tjahjono

Posted 2012-08-18T01:56:36.317

Reputation: 1 242

Answers

39

Primary DNS value:

netsh interface ipv4 set dns "Local Area Connection" static 192.168.0.2

Secondary value:

netsh interface ipv4 add dns "Local Area Connection" 192.168.0.3 index=2

Which works great IF the name of the connection is correct. If the name isn't "Local Area Connection" then it will not work. If you are running XP you need to change "ipv4" to "ip". IPv6 can be used too.

Set subnet mask, IP Address, and Gateway:

netsh interface ipv4 set address name="Local Area Connection" source=static addr=192.168.1.10 mask=255.255.255.0 gateway=192.168.0.1

To Find the network connection you can use ipconfig from the cmd line. But you can also use the following for an abbreviated ipconfig result:

ipconfig | find /I "Ethernet adapter"

using the above ipconfig cmd we can loop through the connection (source code) and set the dns servers:

:: Set primary and alternate DNS for IPv4 on Windows Server 2000/2003/2008 & 
:: Windows XP/Vista/7
@ECHO OFF
SETLOCAL EnableDelayedExpansion

SET adapterName=

FOR /F "tokens=* delims=:" %%a IN ('IPCONFIG ^| FIND /I "ETHERNET ADAPTER"') DO (
SET adapterName=%%a

REM Removes "Ethernet adapter" from the front of the adapter name
SET adapterName=!adapterName:~17!

REM Removes the colon from the end of the adapter name
SET adapterName=!adapterName:~0,-1!

netsh interface ipv4 set dns name="!adapterName!" static 192.168.0.2 primary
netsh interface ipv4 add dns name="!adapterName!" 192.168.0.3 index=2
)

ipconfig /flushdns

:EOF

Logman

Posted 2012-08-18T01:56:36.317

Reputation: 3 452

3

Excellent answer. You should include sources for things like Quotes and Code.

– Ƭᴇcʜιᴇ007 – 2012-08-18T05:14:24.390

8

Also to use DNS addresses provided by the DHCP server:

netsh interface ipv4 set dns "Local Area Connection" dhcp

mmm

Posted 2012-08-18T01:56:36.317

Reputation: 181

plus in case you want to reset the address/mask/gateway to those of DHCP: netsh interface ipv4 set address name="Local Area Connection" source=dhcp – hello_earth – 2018-04-20T07:22:21.853

6

Using a Powershell script in Windows 8 or 2012, you may set the values like this:

Set-DnsClientServerAddress -InterfaceAlias Wi-Fi -ServerAddresses "1.1.1.1","2.2.2.2"

Where wi-Fi is the name of the interface you're interested in. You may list the interfaces by running:

Get-NetAdapter

To reset DNS addresses and this use DHCP:

Set-DnsClientServerAddress -InterfaceAlias wi-fi -ResetServerAddresses

Go to this page to see a full description.

Note that the comandlets used here are not available in earlier versions, such as Windows 7.

Juanal

Posted 2012-08-18T01:56:36.317

Reputation: 161

concise, works like a charm. Thank you :) Especially useful on AWS Opsworks! – Ganesh Hegde – 2015-09-25T18:28:35.203

4

Here is your new friend: QuickSetDNS, by NirSoft, amazing as usual.

screenshot

It also can be used in command line :) with these advantages over netsh:

  • easier syntax, in particular for setting the alternate server
  • automatically asks for privilege elevation


Just a few caveats:

  • supports only setting of IPv4, not of IPv6
    • since QuickSetDNS 1.30, setting IPv6 DNS servers is also supported ;)
  • in command line, the adapter UUID should be used, not the friendly name (e.g. "Local Area Connection")
    • since QuickSetDNS 1.21, connection names are also supported ;)

Gras Double

Posted 2012-08-18T01:56:36.317

Reputation: 866

here is an open-source sample that does use the same approach as above: https://www.codeproject.com/Articles/20639/Setting-DNS-using-iphelp-and-register-DhcpNotifyCo

– Top-Master – 2019-03-11T05:17:13.553

1

Adding a fix to Logman's version for WinXP (sp3 hebrew), seems like it need to remove 2 chars at the end so added a "global" kind of fix for any other weird case.

:: Set primary and alternate DNS for IPv4 on Windows Server 2000/2003/2008 & Windows XP/Vista/7
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET adapterName=

FOR /F "tokens=* delims=:" %%a IN ('IPCONFIG ^| FIND /I "ETHERNET ADAPTER"') DO (
SET adapterName=%%a

REM Removes "Ethernet adapter" from the front of the adapter name
SET adapterName=!adapterName:~17!

REM WinXP Remove some weird trailing chars (don't know what they are)
FOR /l %%a IN (1,1,255) DO IF NOT "!adapterName:~-1!"==":" SET adapterName=!adapterName:~0,-1!

REM Removes the colon from the end of the adapter name
SET adapterName=!adapterName:~0,-1!
echo !adapterName!
GOTO:EOF
netsh interface ip set dns name="!adapterName!" static x.x.x.x primary
netsh interface ip add dns name="!adapterName!" x.x.x.x index=2
)

http://pastebin.com/9mbMR7sy

Sniffleh

Posted 2012-08-18T01:56:36.317

Reputation: 41

0

This answer is copied from XP1 here. If XP1 would like to post this answer, please do so and I will delete my answer.

Here is another way to change DNS by using WMIC (Windows Management Instrumentation Command-line).

The commands must be run as administrator to apply.

Clear DNS servers:

wmic nicconfig where (IPEnabled=TRUE) call SetDNSServerSearchOrder ()

Set 1 DNS server:

wmic nicconfig where (IPEnabled=TRUE) call SetDNSServerSearchOrder ("8.8.8.8")

Set 2 DNS servers:

wmic nicconfig where (IPEnabled=TRUE) call SetDNSServerSearchOrder ("8.8.8.8", "8.8.4.4")

Set 2 DNS servers on a particular network adapter:

wmic nicconfig where "(IPEnabled=TRUE) and (Description = 'Local Area Connection')" call SetDNSServerSearchOrder ("8.8.8.8", "8.8.4.4")

Another example for setting the domain search list:

wmic nicconfig call SetDNSSuffixSearchOrder ("domain.tld")

Nathan

Posted 2012-08-18T01:56:36.317

Reputation: 1 050

0

Recently (end of 2019) I had problem configuring static DNS servers for Linux. I was reading very much about that and there was no single solution that would work for 100%. Always there was other part of system that was changing the values. Then I was digging how really change DNS forever. And the solution has come in that script:

#!/usr/bin/env bash
f="/etc/resolv.conf"
chattr -i $f
rm -f $f
echo "nameserver 1.1.1.1" >> $f
echo "nameserver 8.8.8.8" >> $f
chattr +i $f

That did the trick for long. The most important thing here is to make file with proper body and then set the immutable flag for it (chattr +i).

pbies

Posted 2012-08-18T01:56:36.317

Reputation: 1 633