9

我要完成的工作:我正在尝试使用 powershell 在我的机器上设置 DNS 地址。

这是我的代码:

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

我以此为参考:

使用 Invoke-WmiMethod 设置 DNS 服务器

问题:当我运行脚本时,没有任何变化。如果我运行脚本并重新启动机器,什么都不会发生。我不是远程在本地机器上运行脚本。

我只想添加 1 个 DNS 地址。

我是否可能需要以其他用户身份运行或执行其他特殊操作才能使其正常工作?

4

7 回答 7

7

使用该netsh.exe程序对网络接口进行脚本更改是自动配置它们的好方法。更改 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

几点注意事项:

  • 您需要更改"Local Area Connection"为您正在使用的连接的名称。虽然这通常是默认设置 - 它可能只适用于您的情况。DNS 服务器地址也需要特定于您的方案。
  • 更改 IP 信息通常需要提升权限,因此请确保您正在运行具有提升权限的 PowerShell - 默认情况下是 Windows Vista,然后在不提升权限的情况下启动 PowerShell。您需要右键单击它并选择“以管理员身份运行”。
于 2013-09-10T18:52:25.283 回答
7
$DC = read-host "Please enter a primary DNS"
$Internet = read-host "Please enter secondary DNS"
$dns = "$DC", "$Internet"

对于 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.

对于 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)

由于 DC 出现故障,我从昨天实际为需要为 200 多台计算机设置 DNS 范围的客户端实际编写的脚本中提取了这些内容。

如果你有兴趣,我可以给你整个剧本。该脚本的重点是在域中运行,并在域中设置每台计算机的DNS。

编辑,制作了执行部分的更好版本(PS4+)

如果出现问题,该脚本不应显示任何错误。与以前的 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."
于 2014-10-03T12:41:17.763 回答
7

如果您有一个网络适配器,您可以使用Get-NetAdapter | Set-DnsClientServerAddress -ServerAddresses 8.8.8.8,8.8.4.4

如果您有许多适配器,则需要添加名称,以检查名称运行 Get-NetAdapter

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

于 2018-08-08T12:59:55.327 回答
6

这个答案需要 Powershell 4。

  1. 运行Get-DNSClientServerAddress。在输出中,查找要更改的适配器的接口索引。您将在第 2 步中需要它。
  2. 在提升的提示符中,运行Set-DNSClientServerAddress –interfaceIndex ? –ServerAddresses ("8.8.8.8")where ?is Interface Index 您要更改 DNS 服务器地址的接口(8.8.8.8 是 Google 的 DNS - 始终是一个很好的备用服务器,但将其更改为您想要的任何 DNS 服务器的地址)。
  3. 如果您想将接口更改回“自动获取 DNS 服务器地址”,请在提升的提示符下运行Set-DnsClientServerAddress -InterfaceIndex ? -ResetServerAddresses(感谢此博客提供此提示),再次将您在步骤 1 中查找的接口索引替换为?.
于 2015-10-05T16:43:54.340 回答
4

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

于 2013-09-10T17:16:03.330 回答
3
$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)

多年来一直使用它。将它用于许多数据中心以在虚拟机上配置 DNS。

于 2018-04-22T16:06:26.863 回答
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

在 Vmware 和 HyperV 部署中大量使用它。

于 2018-06-26T20:34:02.097 回答