Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set DNS with PowerShell

What I am trying to accomplish: I am trying to set the DNS address on my machine using powershell.

Here is my code:

$dnsserver = (,"192.168.0.5")
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE | Invoke-WmiMethod -Name SetDNSServerSearchOrder -ArgumentList (,$dnsserver)

I am using this as reference:

Using Invoke-WmiMethod to set the DNS servers

The problem: When I run the script, nothing changes. If I run the script and restart the machine, nothing happens. I am running the script on my local machine not remotely.

I am only wanting to add 1 DNS address.

Do I perhaps need to run as a different user or do something else special in order for this to work?

like image 996
nihiser Avatar asked Sep 10 '13 16:09

nihiser


4 Answers

$vmDNS1 = "192.0.2.1"
$vmDNS2 = "192.0.2.2"
$dns = "$vmDNS1", "$vmDNS2"

$Interface = Get-WmiObject Win32_NetworkAdapterConfiguration 
Write-Host "$(Get-Date -format T):Registering DNS $dns for $server" -ForegroundColor Green
$Interface.SetDNSServerSearchOrder($dns)

Using this from years. Used it against many datacenters to configure DNS on virtual machines.

like image 187
Gajendra D Ambi Avatar answered Oct 12 '22 02:10

Gajendra D Ambi


using the netsh.exe program to script changes to the network interfaces is a great way to automate configuring them. Changing DNS is simple:

# turn on DHCP assigned DNS servers
netsh int ip set address "Local Area Connection" dhcp

# set a static DNS entry
netsh int ip set dns "Local Area Connection" static 192.168.1.1

A few notes:

  • You would need to change "Local Area Connection" to the name of the connection you are working with. Though this is generally the default - it may just work in your case. The DNS server address would also need to be specific to your scenario.
  • Changing IP information usually requires elevated privileges, so make sure you are running PowerShell with elevated rights - by default Windows Vista and later launch PowerShell without elevating it. You will need to right click on it and choose "Run as admin".
like image 7
Goyuix Avatar answered Oct 17 '22 16:10

Goyuix


$DC = read-host "Please enter a primary DNS"
$Internet = read-host "Please enter secondary DNS"
$dns = "$DC", "$Internet"

For powershell 4:

#I know this one is sloppy, but will get the work done.

Set-DnsClientServerAddress -InterfaceIndex 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 17, 18, 19, 20 -ServerAddresses ($DNS)
#I know this one is sloppy, but will get the work done.

For Powershell 1,2 and 3.

$Interface = Get-WmiObject Win32_NetworkAdapterConfiguration 
Write-Host "$(Get-Date -format T):Registering DNS $dns for $server" -ForegroundColor Green
$Interface.SetDNSServerSearchOrder($dns)

I plucked these off a script I wrote actually yesterday for a client that needed to set the DNS range for some-odd 200 Computers since the DC was failing.

If you are interested I can give you the whole script. Point of the script is to run in a domain, and set every computer' DNS in the domain.

Edit, Made a Better version of the executing part (PS4+)

This script should not show any errors, if it does something went wrong. Unlike previous script for ps4, it would always output several errors.

$ErrorActionPreference = "Continue"

#Set all DNS addresses needed.
write-verbose -Verbose "Set all DNS addresses needed."
$DC = "192.168.103.30"
$Internet = "8.8.8.8" #Google
$WorkRouter = "192.168.12.254"
$HomeRouter = "10.0.0.1"
$Possible = "192.168.1.1"
$Possible2 = "192.168.0.1"

#Combine addresses
write-verbose -Verbose "Combining DNS addresses."
$dns = "$DC", "$Internet", "$WorkRouter", "$HomeRouter", "$Possible", "$Possible2"

#Set network adapter ranges
write-verbose -Verbose "Setting network adapter ranges."

#Get Network adapters
write-Verbose -Verbose "Now checking available network adapters."
$Net = Get-NetAdapter | select ifIndex | ft -a | Out-File -FilePath C:/Netadapter.txt
$Net =  "C:/Netadapter.txt"

#Setting ranges to work with
$Ranges = (Get-Content $Net) -creplace "ifIndex", "" -creplace "-", "" | foreach {$_.Trim()} | Where { $_ } | Sort #| out-file C:/Netadapter.txt

#Execute DNS change
write-Warning -Verbose "Now executing DNS change to all available network adapters."
foreach ($range in $ranges)    {
Set-DnsClientServerAddress -InterfaceIndex $range -ServerAddresses ($DNS)
}

write-verbose -Verbose "DNS Settings have been altered."
like image 7
Remy van Tour Avatar answered Oct 17 '22 17:10

Remy van Tour


If you have one network adapter you can use Get-NetAdapter | Set-DnsClientServerAddress -ServerAddresses 8.8.8.8,8.8.4.4

If you have many adapters you need to add name, for checking names run Get-NetAdapter

Get-NetAdapter -Name "vEthernet (DockerNAT)" | Set-DnsClientServerAddress -ServerAddresses 8.8.8.8,8.8.4.4

like image 7
Bogdan Mozgovyi Avatar answered Oct 17 '22 16:10

Bogdan Mozgovyi