【问题标题】:Get-WMIObject Win32_NetworkAdapterConfiguration - Looping through X number of DNS Servers for each NICGet-WMIObject Win32_NetworkAdapterConfiguration - 循环通过每个 NIC 的 X 个 DNS 服务器
【发布时间】:2020-09-07 23:29:07
【问题描述】:

对于一组计算机,我想连接每台计算机,枚举每个具有真实 IP 的 NIC,并且对于每个 NIC,我想循环通过每个 DNS 服务器(第一、第二、第三、第四、第五等)如果它包含特定的 IP(例如 8.8.8.8),我想在不影响任何其他 DNS 服务器的情况下替换它(用 7.7.7.7)。我如何为 X 数量的 DNS 服务器执行此操作,而无需一次执行每个服务器条目(就像我在下面对前 3 个所做的那样)并同时更改它。

$computer ='wrk-01'
$NICs     = Get-WMIObject Win32_NetworkAdapterConfiguration -computername $computer | 
            where{$_.IPEnabled -eq "TRUE"}

Foreach($NIC in $NICs) {

  #  $DNSServerCount = $Nic.DNSServerSearchOrder.Count
  #  $DNSServerArray = @($nic.DNSServerSearchOrder[$DNSServerCount - $DNSServerCount,$DNSServerCount - $DNSServerCount + 1,$DNSServerCount - $DNSServerCount + 2])
   # write-host $nic.description
 #   write-host $nic.PSComputerName $DNSServerArray

    if($nic.dnsserversearchorder[0] -like "8.8.8.8"){   
    write-host "matched 8.8.8.8 at position 0"
    $NIC.SetDNSServerSearchOrder(@("7.7.7.7", $nic.dnsserversearchorder[1], $nic.dnsserversearchorder[2]))
    }

    if($nic.dnsserversearchorder[1] -like "8.8.8.8"){   
    write-host "matched 8.8.8.8 at position 1"
    $NIC.SetDNSServerSearchOrder(@($nic.dnsserversearchorder[0],"7.7.7.7", $nic.dnsserversearchorder[2]))
    }

        if($nic.dnsserversearchorder[2] -like "8.8.8.8"){   
    write-host "matched 8.8.8.8 at position 2"
    $NIC.SetDNSServerSearchOrder(@($nic.dnsserversearchorder[0], $nic.dnsserversearchorder[1],"7.7.7.7"))
    }

}


【问题讨论】:

    标签: arrays powershell foreach get-wmiobject


    【解决方案1】:

    这是检查和更新是否匹配的一种方法。一旦找到匹配项,它将用期望的替换替换任何匹配行,否则输出,收集的列表然后设置为新的 DNS 服务器。如果没有匹配,它将继续到下一个 nic。

    $computer ='wrk-01'
    $NICs = Get-WMIObject Win32_NetworkAdapterConfiguration -computername $computer | 
                where{$_.IPEnabled -eq "TRUE"}
    
    Foreach($NIC in $NICs)
    {
        $DNSIPs = $nics.DNSServerSearchOrder
        if($DNSIPs -contains '8.8.8.8')
        {
            Write-Host "Match found... updating" -ForegroundColor Green
            $NewDNS = $DNSIPs | foreach {
                $_ -replace '8.8.8.8','7.7.7.7'
            }
            $null = $NICs.SetDNSServerSearchOrder($NewDNS)
        }
    }
    

    一个可能会让您头疼的建议是不要使用复数变量名,而是使用这样的描述性名称。

    $computer ='wrk-01'
    $NICList = Get-WMIObject Win32_NetworkAdapterConfiguration -computername $computer | 
                where{$_.IPEnabled -eq "TRUE"}
    
    Foreach($NIC in $NICList)
    {
        $DNSIPList = $nics.DNSServerSearchOrder
        if($DNSIPList -contains '8.8.8.8')
        {
            Write-Host "Match found... updating" -ForegroundColor Green
            $NewDNS = $DNSIPList | foreach {
                $_ -replace '8.8.8.8','7.7.7.7'
            }
            $null = $NICs.SetDNSServerSearchOrder($NewDNS)
        }
    }
    

    【讨论】:

    • 非常感谢,完美运行!我忘记了脚本本身内部的流水线:)。顺便说一句,最后一行实际上设置了 DNS 顺序,但是 $null 是什么?并感谢有关变量名称的提示。
    • $null 只是吞下 wmi 输出以保持控制台清洁。
    猜你喜欢
    • 2017-11-01
    • 2013-04-18
    • 1970-01-01
    • 2021-01-10
    • 2017-04-28
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多