PowerShell: Получить список DNS имен по списку IP адресов (и наоборот)

04 декабрь 2020, Пятница
7 071
1
0 0
В повседневной работе, регулярно приходилось сталкиваться с ситуацией, когда на входе имеется список из ip адресов, по которым необходимо провести какие-то операции: обновление, удаление, перезагрузка, выключение. При этом, сами ip адреса без DNS имен не информативны. И вот встает задача, получить из списка IP адресов список, в котором для каждого IP адреса сделана попытка получить его DNS имя. И уже по имени сервера, можно понимать, что это за сервер, кто за него ответственный, какие операции с ним можно выполнять и в какое время.


Получаем из списка IP адресов список DNS имен

Итак, задача сводится к следующему:
На входе: есть файл, в котором в одну колонку перечислены ip адреса. Файл с названием: ip.txt
На выходе: надо получить файл, имеющий 2 колонки: IP адрес, DNS имя сервера (если оно найдено). Результат записать в файл с названием: ipdns.txt c запятой в качестве разделителя.

Один из примеров реализации для PowerShell начиная с версии Windows 8/Windows 2012
$ipaddress=Get-Content -Path C:\Temp\ip.txt # Читаем содержимое файла

$results = @()

ForEach ($ip in $ipaddress)
 { # Обрабатываем построчно, для каждого IP
    $obj=new-object psobject
    
    $hostname = ""
    
    #Выполняем разрешение IP адреса в DNS имя
    $hostname = Resolve-DnsName -Name $ip -Type PTR -ErrorAction SilentlyContinue 

    # записываем в объект полученным результат
    $obj | Add-Member -MemberType NoteProperty -Name ip -Value ($ip)
    $obj | Add-Member -MemberType NoteProperty -Name hostname -Value ($hostname.NameHost)

    #Формируем массив объектов
    $results +=$obj
}
# Выводим результат в файл
$results | Select-Object -Property ip, hostname | Export-Csv C:\temp\ipdns.txt -Encoding UTF8 -Delimiter "," -NoTypeInformation 

В ранних версия PowerShell вместо команды:
Resolve-DnsName -Name $ip -Type PTR

рекомендовалось использовать командлет:
[System.Net.Dns]::GetHostByAddress($ip)


Получаем из списка DNS имен список IP адресов

В случае, если стоит обратная задача, из списка DNS имен, получить список ip адресом, то слегка меняем исходный текст и получаем, следующий скрипт:
$dnsnames=Get-Content -Path C:\Temp\dns.txt # Читаем содержимое файла

$results = @()

ForEach ($dns in $dnsnames)
 { # Обрабатываем построчно, для каждого DNS имени
    $obj=new-object psobject
    
    $ip = ""
    
    #Выполняем разрешение DNS имени в IP адрес
    $ip = Resolve-DnsName -Name $dns -Type A -ErrorAction SilentlyContinue 

    # записываем в объект полученным результат
    $obj | Add-Member -MemberType NoteProperty -Name dns -Value ($dns)
    $obj | Add-Member -MemberType NoteProperty -Name ip -Value ($ip.IPAddress)

    #Формируем массив объектов
    $results +=$obj
}
# Выводим результат в файл
$results | Select-Object -Property dns, ip | Export-Csv C:\temp\ip.txt -Encoding UTF8 -Delimiter "," -NoTypeInformation 
В этом случае исходным файл с dns именами называется dns.txt, а целевой ip.txt
Комментарии:
Прокомментировать
  1. Michael Vigandas 29 августа 2021 16:48
    Спасибо, хорошие примеры
При использовании материалов ссылка на сайт UserMan.ru обязательна.
Политика конфиденциальности
Пользовательское соглашение
UserMan.ru © 2017-2024
Соцсети: VK