【问题标题】:Set DNS with PowerShell使用 PowerShell 设置 DNS
【发布时间】:2013-09-14 11:18:47
【问题描述】:

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

这是我的代码:

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

我以此为参考:

Using Invoke-WmiMethod to set the DNS servers

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

我只想添加 1 个 DNS 地址。

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

【问题讨论】:

  • 您是否运行提升的 Powershell 控制台?
  • 我不这么认为。除了“cmd > 右键单击​​“以管理员身份运行”'之外,这还需要什么?
  • 它认为你没有选择最好的参考,看看这里blogs.technet.com/b/heyscriptingguy/archive/2012/02/28/…
  • @Kayasax 做到了!我以管理员身份运行并繁荣。谢谢。如果你想把它作为答案,我可以接受。

标签: windows powershell windows-7 dns


【解决方案1】:
$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。

【讨论】:

    【解决方案2】:

    如果你有一个网络适配器,你可以使用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

    【讨论】:

    • 你可以更多serveraddresses逗号分隔?
    【解决方案3】:

    这是我使用的.. 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 部署中经常使用它。

    【讨论】:

      【解决方案4】:

      此答案需要 Powershell 4。

      1. 运行Get-DNSClientServerAddress。在输出中,查找要更改的适配器的接口索引。您将在第 2 步中用到它。
      2. 在提升的提示符中,运行 Set-DNSClientServerAddress –interfaceIndex ? –ServerAddresses ("8.8.8.8"),其中 ? 是您要更改 DNS 服务器地址的接口的接口索引(8.8.8.8 是 Google 的 DNS - 始终是一个很好的备用服务器,但要更改这个到你想要的任何 DNS 服务器的地址)。
      3. 如果您想将界面改回“自动获取 DNS 服务器地址”,在提升的提示符中,运行 Set-DnsClientServerAddress -InterfaceIndex ? -ResetServerAddresses(感谢 this blog 提供此提示),再次替换您在第 1 步中为 ? 查找的接口索引。

      【讨论】:

      • 第 2 步和第 3 步:您可以使用 Get-NetAdapter -Name "&lt;e.g. vEthernet&gt;" | set-dnsclientserv&lt;...&gt;pipe 来代替参数 -interfaceindex,以使其更具可读性。
      【解决方案5】:
      $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)
      

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

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

      Edit, Made a Better version of the execution part (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."
      

      【讨论】:

        【解决方案6】:

        使用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。您需要右键单击它并选择“以管理员身份运行”。

        【讨论】:

        • 这也是一个很好的解决方案,但是在我的情况下,我并不总是知道“本地连接”是否是正确的值。
        • 对于它的价值:你也不能依赖它在你的 WMI 查询中总是 index=7。应提前查找或配置任一值。
        • 也是正确的,很好的收获。此后,我将其替换为“-Filter IPEnabled=TRUE”。 (我一直在尝试一些不同的变体,在发帖时这就是我正在使用的)
        • 我可以添加第二个 dns 条目吗?
        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2014-09-21
          • 2015-11-11
          • 1970-01-01
          • 1970-01-01
          • 2017-09-08
          • 2018-12-21
          • 2017-03-21
          • 1970-01-01
          相关资源
          最近更新 更多