#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, чтобы сохранить консоль чистой.