简体   繁体   English

使用PowerShell设置DNS

[英]Set DNS with PowerShell

What I am trying to accomplish: I am trying to set the DNS address on my machine using powershell. 我想要完成的任务:我正在尝试使用PowerShell在我的机器上设置DNS地址。

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 使用Invoke-WmiMethod设置DNS服务器

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. 我只想添加1个DNS地址。

Do I perhaps need to run as a different user or do something else special in order for this to work? 我是否可能需要以不同的用户身份运行或执行其他特殊操作才能使其正常工作?

using the netsh.exe program to script changes to the network interfaces is a great way to automate configuring them. 使用netsh.exe程序编写对网络接口的更改脚本是自动配置它们的好方法。 Changing DNS is simple: 更改DNS很简单:

# 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. 您需要将"Local Area Connection"更改为您正在使用的连接的名称。 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. DNS服务器地址也需要特定于您的方案。
  • 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. 更改IP信息通常需要提升权限,因此请确保您使用提升的权限运行PowerShell - 默认情况下Windows Vista以及稍后启动PowerShell而不提升它。 You will need to right click on it and choose "Run as admin". 您需要右键单击它并选择“以管理员身份运行”。
$DC = read-host "Please enter a primary DNS"
$Internet = read-host "Please enter secondary DNS"
$dns = "$DC", "$Internet"

For powershell 4: 对于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. 对于Powershell 1,2和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. 我从昨天写的一个脚本中摘取了这些脚本,这个脚本需要为自从DC失败后的奇数200台计算机设置DNS范围。

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. 脚本的要点是在域中运行,并在域中设置每台计算机的DNS。

Edit, Made a Better version of the executing part (PS4+) 编辑,制作更好的执行部分版本(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. 与以前的ps4脚本不同,它总是会输出几个错误。

$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."

This answer requires Powershell 4. 这个答案需要Powershell 4。

  1. Run Get-DNSClientServerAddress . 运行Get-DNSClientServerAddress In the output, look for the Interface Index of the adapter you want to change. 在输出中,查找要更改的适配器的接口索引。 You will need this in step 2. 您将在第2步中使用此功能。
  2. In an elevated prompt , run Set-DNSClientServerAddress –interfaceIndex ? –ServerAddresses ("8.8.8.8") 在提升的提示符下 ,运行Set-DNSClientServerAddress –interfaceIndex ? –ServerAddresses ("8.8.8.8") Set-DNSClientServerAddress –interfaceIndex ? –ServerAddresses ("8.8.8.8") where ? Set-DNSClientServerAddress –interfaceIndex ? –ServerAddresses ("8.8.8.8")在哪里? 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). 是要更改DNS服务器地址的接口的接口索引(8.8.8.8是Google的DNS - 始终是一个很好的备用,但将其更改为您想要的任何DNS服务器的地址)。
  3. If you want to change the interface back to 'Obtain DNS server address automatically', in an elevated prompt , run Set-DnsClientServerAddress -InterfaceIndex ? -ResetServerAddresses 如果要将接口更改回“自动获取DNS服务器地址”,请在提升的提示符下运行Set-DnsClientServerAddress -InterfaceIndex ? -ResetServerAddresses Set-DnsClientServerAddress -InterfaceIndex ? -ResetServerAddresses (Thanks to this blog for this tip), again substituting the Interface Index you looked up in step 1 for ? Set-DnsClientServerAddress -InterfaceIndex ? -ResetServerAddresses (感谢此博客提供此技巧),再次替换您在步骤1中查找的接口索引? .

管理网络接口通常需要管理权限,因此您必须在elethled PowerShell控制台中运行脚本。

$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. 将它用于许多数据中心以在虚拟机上配置DNS。

This is what I use.. PS 5.1 这是我用的.. 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. 在Vmware和HyperV部署中使用这个很多。

If you have one network adapter you can use Get-NetAdapter | Set-DnsClientServerAddress -ServerAddresses 8.8.8.8,8.8.4.4 如果您有一个网络适配器,则可以使用Get-NetAdapter | Set-DnsClientServerAddress -ServerAddresses 8.8.8.8,8.8.4.4 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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM