Reputation: 604
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?
Upvotes: 10
Views: 40296
Reputation: 1
Set custom DNS server for IPv4 and IPv6 for every 'UP' adapter. (all customizable)
# Quad9 DNS servers
$Ipv4PrimaryDns = '9.9.9.9'
$Ipv4BackupDns = '149.112.112.112'
$Ipv6PrimaryDns = '2620:fe::fe'
$Ipv6BackupDns = '2620:fe::9'
Get-NetAdapter | Where-Object Status -eq 'Up' | ForEach-Object {
Set-DnsClientServerAddress -InterfaceIndex $_.ifIndex -ServerAddresses $Ipv4PrimaryDns, $Ipv4BackupDns, $Ipv6PrimaryDns, $Ipv6BackupDns
}
Clear-DnsClientCache
Upvotes: 0
Reputation: 4233
$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.
Upvotes: 3
Reputation: 171
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
Upvotes: 8
Reputation: 199
This is what I use.. PS 5.1
$ipaddress = <ip>
$Gateway = <gateway IP>
$netadapter = <InterfaceAlias>
$primary = <First DNS record or comma seperated IP's>
$NetScript = @"
Get-Netadapter -Name $netadapter | New-NetIPAddress -AddressFamily IPv4 -IPAddress $IP -PrefixLength 23 -Type Unicast -DefaultGateway $Gateway
Set-DnsClientServerAddress -InterfaceAlias 'Ethernet0' -ServerAddresses $primary
Disable-NetAdapterBinding -Name "Ethernet0" -ComponentID ms_tcpip6
Disable-NetAdapterBinding -Name "Ethernet0" -DisplayName "QoS Packet Scheduler"
"@
$NetScript = $NetScript.Replace('#netadapter#', $netadapter).Replace('#Ipaddress#', $IP).Replace('#Gateway#', $Gateway)
#Where Ethernet0 = InterfaceAlias
Use this alot in Vmware and HyperV deployments.
Upvotes: 1
Reputation: 2501
This answer requires Powershell 4.
Get-DNSClientServerAddress
. In the output, look for the Interface Index of the adapter you want to change. You will need this in step 2.Set-DNSClientServerAddress –interfaceIndex ? –ServerAddresses ("8.8.8.8")
where ?
is the Interface Index of the interface you want to change DNS server address for (8.8.8.8 is Google's DNS - always a good standby, but change this to the address of whatever DNS server you want).Set-DnsClientServerAddress -InterfaceIndex ? -ResetServerAddresses
(Thanks to this blog for this tip), again substituting the Interface Index you looked up in step 1 for ?
.Upvotes: 8
Reputation: 629
$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.
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."
Upvotes: 8
Reputation: 24370
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:
"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.Upvotes: 7
Reputation: 26170
managing network interfaces usualy require administrative rights, so you have to run your script in an elevaled powershell console.
Upvotes: 4