Получаем-WmiObject Win32_NetworkAdapterConfiguration — перебираем X количество DNS-серверов для каждого сетевого адаптера

#arrays #powershell #foreach #get-wmiobject

#массивы #powershell #для каждого #get-wmiobject

Вопрос:

Для группы компьютеров я хочу подключиться к каждому из них, перечислить каждую сетевую карту с реальным IP, и для каждой сетевой карты я хочу перебирать каждый DNS-сервер (первый, второй, третий, четвертый, пятый и т.д.), И если он содержит определенный IP (например, 8.8.8.8), я хочу заменить его (на 7.7.7.7), не затрагивая другие DNS-серверы. Как мне сделать это для 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"))
    }

}


  

Ответ №1:

Вот один из способов проверить и обновить, есть ли совпадение. Как только совпадение найдено, оно заменит любую соответствующую строку желаемой заменой, в противном случае вывод, собранный список затем устанавливается в качестве новых DNS-серверов. Если ни один из них не совпадает, он просто перейдет к следующему сетевому адаптеру.

 $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)
    }
}
  

Комментарии:

1. Большое спасибо, работает отлично! Я забыл о конвейерной обработке внутри самого скрипта 🙂 . Кстати, последняя строка фактически задает порядок DNS, но для чего нужен $ null? И спасибо за совет по именам переменных.

2. $Null просто проглатывает вывод wmi, чтобы сохранить консоль чистой.