Windows 使用PowerShell设置DNS

Windows 使用PowerShell设置DNS,windows,powershell,windows-7,dns,Windows,Powershell,Windows 7,Dns,我正在尝试完成的任务:我正在尝试使用powershell在我的计算机上设置DNS地址 这是我的代码: $dnsserver = (,"192.168.0.5") Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE | Invoke-WmiMethod -Name SetDNSServerSearchOrder -ArgumentList (,$dnsserver) 我将此作为参考: $dns

我正在尝试完成的任务:我正在尝试使用powershell在我的计算机上设置DNS地址

这是我的代码:

$dnsserver = (,"192.168.0.5")
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE | Invoke-WmiMethod -Name SetDNSServerSearchOrder -ArgumentList (,$dnsserver)
我将此作为参考:

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

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

我只想添加一个DNS地址


我是否需要以其他用户的身份运行或执行其他特殊操作才能运行此功能?

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

使用该程序为网络接口的更改编写脚本是自动配置这些更改的一种好方法。更改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
请注意:

  • 您需要将“局域网连接”更改为您正在使用的连接的名称。虽然这通常是默认设置,但它可能只适用于您的情况。DNS服务器地址也需要特定于您的场景
  • 更改IP信息通常需要提升的权限,因此请确保您使用提升的权限运行PowerShell-默认情况下为Windows Vista,稍后在不提升权限的情况下启动PowerShell。您需要右键单击它并选择“以管理员身份运行”
对于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."

这个答案需要Powershell 4

  • 运行
    获取DNSClientServerAddress
    。在输出中,查找要更改的适配器的接口索引。在第2步中,您将需要此功能
  • 在提升的提示符中,运行
    Set DNSClientServerAddress–interfaceIndex?-ServerAddresses(“8.8.8.8”)
    其中
    是要更改DNS服务器地址的接口的接口索引(8.8.8.8是Google的DNS-始终是一个良好的备用,但将其更改为您想要的任何DNS服务器的地址)
  • 如果要将接口更改回“自动获取DNS服务器地址”,请在提升的提示中运行
    Set DnsClientServerAddress-InterfaceIndex-ResetServerAddresses
    (感谢本技巧),再次将您在步骤1中查找的接口索引替换为

  • 多年来一直使用这个。对许多数据中心使用它来配置虚拟机上的DNS。

    这就是我使用的。。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
    
    $ipaddress=
    $Gateway=
    $netadapter=
    
    $primary=如果您有一个网络适配器,您可以使用
    Get NetAdapter | Set DnsClientServerAddress-serveraddress 8.8.8,8.8.4.4

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


    获取NetAdapter-名称为“vEthernet(DockerNet)”|设置DnsClientServerAddress-ServerAddresses 8.8.8.8,8.8.4.4

    是否运行提升的powershell控制台?我不这么认为。除了“cmd>右键单击“以管理员身份运行”之外,还需要什么吗?它认为您没有选择最佳参考,请在这里@Kayasax查看一下,就是这样!我以管理员和boom的身份跑步。谢谢如果你想把它作为一个答案,我可以接受。这也是一个很好的解决方案,但在我的情况下,我并不总是知道“局域网连接”是不是正确的值。值得一提的是:你也不能依赖它在WMI查询中总是索引=7。这两个值都应该提前查找或配置。同样正确,捕捉良好。此后,我将其替换为“-Filter IPEnabled=TRUE”。(我一直在尝试一些不同的变体,在发布时我正在使用这些变体)我可以添加第二个dns条目吗?您可以使用更多
    服务器地址
    逗号分隔?步骤2和步骤3:您可以使用
    获取NetAdapter-名称,而不是param
    -interfaceindex
    |使用
    管道设置dnsclientserv
    ,使其可读性更好。
    $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