Если вы управляете веб- или почтовыми серверами, вы знаете, насколько сильно эти серверы зависят от правильно настроенных DNS-записей. Отсутствие DNS-записей может вызвать различные проблемы, включая невозможность пользователями найти ваш веб-сайт или недоставку электронных писем. Хорошо, что существует cmdlet PowerShell Resolve-DnsName, и с его помощью мониторинг DNS-записей можно автоматизировать с помощью сценариев.
День администратора уже достаточно наполнен, и ручная проверка того, можно ли правильно разрешить DNS-записи, требует дополнительных усилий.
В этой статье вы узнаете, что такое и как использовать cmdlet Resolve-DnsName
для запроса DNS-записей с использованием PowerShell. К концу этой статьи вы также узнаете, как создать базовый сценарий для создания отчета о ваших назначенных DNS-записях для мониторинга.
Предварительные требования
Эта статья является пошаговым руководством, и если вы собираетесь следовать примерам, вам понадобится:
- A computer running Windows 10 or above.
- Windows PowerShell 5.1 или PowerShell 7.0
- A script editor such as Visual Studio Code, Atom, or Notepad++.
Resolve-DnsName: Разрешение DNS в PowerShell
Есть более одного способа выполнить DNS-запрос. Cmdlet Resolve-DnsName
аналогичен nslookup
командной строковой утилите, поставляемой с Windows, или dig
команде, если вы склонны больше к администрированию Linux.
Некоторые веб-сайты предлагают услуги мониторинга/отчетности записей DNS. Но, эти услуги от третьих сторон в основном предоставляются за плату, конечно. Есть бесплатная альтернатива, которая также позволяет вам продемонстрировать свои навыки написания сценариев!
Командлет Resolve-DnsName
, как следует из его названия, разрешает имена DNS в IP-адреса и наоборот. Этот командлет является частью модуля PowerShell dnsclient, который на момент написания этого текста поставляется вместе с Windows 10, Windows Server 2012/R2, Windows Server 2016 и Windows Server 2019.
Поскольку Resolve-DnsName
является командлетом PowerShell, он возвращает результаты в виде объектов, которые можно сохранять, обрабатывать и экспортировать. Например, запрос записи DNS google.com с использованием команды Resolve-DnsName google.com
даст вам выходные данные, показанные ниже.

Результат возвращается как объект, который позволяет экспортировать результаты в файл CSV или изменять формат для создания отчетов в формате HTML.
Командлет Resolve-DnsName
отличается от старомодной утилиты nslookup
. nslookup
возвращает простую строку. Пример можно увидеть на следующем скриншоте. Если вам нужно извлечь какую-либо из этой информации, это будет непросто.

Запрашивание различных типов DNS-записей
По умолчанию, Resolve-DnsName
запрашивает типы DNS-записей A и AAAA. Например, если вы ищете DNS-запись для gmail.com
, используя команду ниже:
Как вы можете видеть ниже, возвращаются только записи AAAA и A. Это потому, что тип DNS-записи для поиска не был указан.

Теперь, учитывая, что мы все знаем, что gmail.com является почтовым доменом, используемым почтовым сервисом Google, должна быть связана с ним запись MX, верно? Ну, нет необходимости предполагать, когда вы можете подтвердить это, используя эту команду:
Вывод, показанный на скриншоте ниже, демонстрирует список записей MX для gmail.com.

Чтобы узнать больше о различных типах записей, которые можно использовать с
Resolve-DnsName
, посетите эту ссылку и найдите таблицу для параметра-Type
. Или вы можете просто обратиться к помощи Resolve-DnsName, используя командуget-help Resolve-DnsName
.
Использование конкретных серверов для DNS-запроса
Resolve-DnsName
использует адреса DNS-серверов, настроенные на вашем компьютере по умолчанию. Однако вы также можете указать Resolve-DnsName
использовать определенный DNS-сервер при выполнении поиска.
Например, если вы хотите использовать Google Public DNS для поиска записей, вы можете сделать это, добавив параметр -Server
в вашу команду, аналогично приведенному ниже примеру.
Результат выполнения команды будет аналогичен показанному на скриншоте ниже.

В этот момент вы могли бы задаться вопросом: “зачем мне нужно использовать другой DNS-сервер?”. Это вполне обоснованный вопрос. Если вы попытаетесь найти ту же запись, используя DNS-сервер по умолчанию вашего компьютера или другой DNS-сервер, вероятно, вы получите тот же результат.
Существует много причин использовать различные DNS-серверы с Resolve-DnsName
. Некоторые из этих причин могут включать:
- Скорость – Некоторые DNS-серверы могут работать быстрее других.
- Безопасность – Некоторые DNS-серверы могут иметь больше мер безопасности, чем другие, что предотвращает захваты и атаки.
- Доступность записей – В большинстве случаев организации имеют свои собственные внутренние серверы DNS, которые содержат зоны и записи для имен, которые разрешаются только внутри сети. В этом случае запрос внутреннего имени через общедоступный сервер DNS завершится неудачей.

- Серверы DNS не пересылают запросы – Некоторые организации не разрешают пересылку DNS. Попытка использовать их для запроса записей общедоступного DNS завершится неудачей.
- Устранение неполадок и тестирование – Если ваши любимые серверы DNS работают некорректно, вам может захотеться протестировать свои запросы с использованием другого сервера DNS.
Сообщения о записях DNS с использованием сценария PowerShell
Теперь, когда вы освоили основы использования командлета Resolve-DnsName
, в этом разделе вы научитесь создавать сценарий PowerShell для отслеживания и отчетности о записях DNS. Вы должны сможете применить полученные знания из предыдущих разделов при создании этого сценария.
Запустите ваш редактор сценариев по выбору и создайте новый файл с именем GetDnsRecord.ps1.
Определение переменных
Сначала определите переменные для использования. Эти переменные будут включать в себя следующее:
$NameList
– Эта переменная будет содержать имена записей DNS, которые вы хотите, чтобы ваш сценарий запрашивал$Serverlist
– Используйте эту переменную, чтобы указать серверы DNS, которые будут использоваться сценарием для запросов.
Скопируйте приведенный ниже код и вставьте его в начало вашего сценария.
Выполнение DNS-запросов
Затем код должен иметь возможность проверить запись DNS для каждого указанного имени. В этом случае будет использоваться цикл foreach для перебора списка записей и проверки каждого имени с помощью Resolve-DnsName
.
Строка $FinalResult = @()
создает пустой массив, в котором будет сохранен конечный результат. Затем, используя цикл foreach, PowerShell передает каждый элемент переменной $NameList
в переменную с именем $Name
.
На каждой итерации строка $tempObj = "" | Select-Object Name,IPAddress,Status,ErrorMessage
создает временный объект с четырьмя свойствами для хранения результата успешного поиска DNS.
Затем используется оператор try{}
для выполнения команды Resolve-DnsName
для поиска записей A DNS и заполнения значений $tempObj
. В случае сбоя поиска DNS оператор catch{}
перехватывает ошибку, и ошибка будет включена в объект $tempObj
.
По завершении каждой итерации значение объекта $tempObj
будет добавлено к $FinalResult
. И как только обработан последний элемент в массиве $NameList
, цикл завершится. Затем будет отображено значение $FinalResult
.
Скопируйте приведенный ниже код и вставьте его в конец своего скрипта. Не нужно изменять значения.
После сохранения скрипта запустите его в PowerShell, вызвав его имя GetDnsRecord.ps1. Приведенная ниже демонстрация показывает вывод.

Как видите из приведенного выше результата, вывод представляет собой объект, который полезен, если вы хотите экспортировать результаты в файл, например CSV, с использованием следующей команды.
Выход CSV будет выглядеть примерно так.

Заключение
В этой статье вы узнали основы использования командлета Resolve-DnsName
для выполнения поиска записей DNS в PowerShell. Вы также узнали, как Resolve-DnsName
отличается от других инструментов, таких как утилита nslookup.
Вы видели, как Resolve-DnsName
может использоваться в скрипте для автоматизации поиска записей DNS. Это будет полезным инструментом мониторинга, чтобы вы всегда знали текущее состояние DNS-записей, за которыми следите.
Используя ваши навыки написания сценариев PowerShell, отчетный сценарий может быть дополнительно усовершенствован путем добавления кода для автоматической отправки отчета по электронной почте на указанные адресаты. Его также можно модифицировать для создания визуально привлекательного HTML-вывода.
В конце концов, Resolve-DnsName
– отличный инструмент для поиска DNS, независимо от того, используете ли вы его вручную или для автоматизации в сценариях. Теперь у вас есть знания о том, как он работает, и зависит от вас найти способы использовать его в рамках ваших административных задач.
Дальнейшее чтение
- Google Public DNS
- Back to Basics: Understanding PowerShell Objects
- Экспорт в CSV: Путь PowerShell к обращению с файлами CSV как с гражданами первого класса
- PowerTip: Используйте PowerShell для получения настроек DNS
- Создание HTML-отчетов в PowerShell с помощью ConvertTo-Html
- Как создать HTML-отчет с помощью PowerShell