понедельник, 7 сентября 2015 г.

Powershell. Как узнать DNS имя по IP адресу

  Займемся поиском DNS имени по IP адресу средствами Powershell. Не путайте со статьей как найти NETBIOS имя хоста по IP адресу с помощью Powershell. НЕТБИОС имя действует в локальной сети, а DNS-именем можно адресовать хосты по всему интернету.
  Во всех скриптах переменная $IP содержит IP-адрес хоста которому надо узнать DNS-имя.
  Я нашел три способа решить этот вопрос.

Командлет System.Net.Dns

  Эта возвращает небольшую таблицу, где можно посмотреть DNS имя:
"[System.Net.Dns]::GetHostbyAddress($IP)"
  Если надо только DNS имя без лишних надписей, то в конце добавляем:
"[System.Net.Dns]::GetHostbyAddress($IP).HostName"

Командлет Resolve-DnsName

  Этот командлет показывает таблицу с DNS параметров этого IP.
"Resolve-DnsName -Name $IP"
  Узнать только DNS имя можно так:
"(Resolve-DnsName -Name $IP).NameHost"
  Если командлет не может разрешить имя хоста, то он возвращает большое описание ошибки. Чтобы убрать эти лишние строки можно добавил параметр "-ErrorAction SilentlyContinue". Тогда при ошибке возвращается пустая строка.
  Итоговая команда выглядит так:
"(Resolve-DnsName -Name $IP -ErrorAction SilentlyContinue).NameHost"

Анализ команды Ping

  Команда "Ping -a" пытается найти DNS имя узла. Нам остается потом проанализировать вывод этой команды и вычленить имя хоста.
  Я реализовал это так:

$Cmd_Ping_Out=ping -a -4 -n 1 $IP | Where-Object {$_.Contains("[$IP]")}
if ($Cmd_Ping_Out -ne $NULL) {
  $DNS_Name=$Cmd_Ping_Out.Split(" ")[3]
}