Что такое DNS-записи
Ресурсные записи DNS содержат информацию об объектах и ресурсах, находящихся в DNS-зоне, например компьютерах, серверах и сетевых службах.
Обычная ресурсная DNS-запись содержит следующие данные:
- имя узла (Hostname);
- время, в течение которого запись может храниться в кэше (TTL);
- тип ресурсной записи, например A-запись;
- данные, соответствующие типу записи, например IPv4-адрес узла.
DNS-записи можно создавать вручную. Также они могут регистрироваться автоматически, например при подключении Windows-клиентов к сети с использованием DHCP и динамического обновления DNS.
Наиболее распространённые типы DNS-записей:
- A, AAAA — адреса узлов;
- CNAME — псевдонимы;
- MX — почтовые серверы;
- PTR — записи обратного разрешения имён;
- SRV — расположение служб;
- NS — DNS-серверы зоны;
- TXT — текстовые записи;
- DNAME — перенаправление поддомена;
- SOA — основная информация о DNS-зоне.
Проверка устаревших записей в Диспетчере DNS
Откройте Диспетчер DNS (DNS Manager) и найдите старую DNS-запись. Для дальнейшей проверки нам понадобятся имя узла (Hostname), полное доменное имя (FQDN) и IP-адрес.
В нашем примере необходимо найти записи контроллера домена, который ранее был выведен из эксплуатации:
- Hostname: DC01-2019
- FQDN: DC01-2019.exoip.local.
- IP-адрес: 192.168.1.51
Щёлкните правой кнопкой мыши по нужной DNS-зоне и выберите Свойства (Properties).
Перейдите на вкладку Серверы имен (Name Servers).
В списке присутствует старый сервер. Это означает, что для него в DNS-зоне по-прежнему существует запись типа NS (Name Server).
В DNS-зоне также присутствует запись узла типа A (Host) для старого сервера.
В DNS-зоне также присутствует запись типа SRV (Service Location), связанная со старым сервером.
Если продолжить проверку остальных DNS-зон, можно обнаружить и другие устаревшие записи, связанные с этим объектом компьютера Active Directory.
Просматривать все DNS-зоны и вручную удалять старые записи долго и неудобно. Кроме того, некоторые записи легко пропустить, в результате чего они продолжат храниться на DNS-сервере.
Вместо ручной проверки каждой зоны автоматизируем этот процесс с помощью PowerShell. Скрипт позволит найти и удалить устаревшие DNS-записи, связанные с нужным объектом компьютера Active Directory.
Удаление устаревших DNS-записей с помощью PowerShell
Для автоматического удаления старых DNS-записей можно использовать PowerShell-скрипт Remove-DNSRecords.ps1.
В своей работе он использует три основных командлета:
- Get-DnsServerZone — получает список основных DNS-зон.
- Get-DnsServerResourceRecord — ищет ресурсные записи, соответствующие указанным FQDN, Hostname и IP-адресу.
- Remove-DnsServerResourceRecord — удаляет найденные DNS-записи.
Шаг 1. Загрузка PowerShell-скрипта Remove-DNSRecords
Скачайте скрипт Remove-DNSRecords.ps1 и поместите его на контроллер домена в каталог C:\scripts.
Если папки scripts нет, создайте её.
Перед запуском убедитесь, что файл не заблокирован Windows, иначе при выполнении скрипта может возникнуть ошибка.
Также можно скопировать приведённый ниже код в Блокнот, сохранить файл под именем Remove-DNSRecords.ps1 и поместить его в каталог C:\scripts.
<#
.SYNOPSIS
Remove-DNSRecords.ps1
.DESCRIPTION
Clean up stale DNS records with PowerShell.
.LINK
https://sysadminhub.ru/produkty-microsoft/windows-server/clean-up-dns-records-powershell
.NOTES
Website: https://sysadminhub.ru
.CHANGELOG
V1.00, 01/20/2024 - Initial version
#>
$ServerFQDN = "dc01-2019.exoip.local." #Keep the dot (.) at the end
$ServerHostname = "dc01-2019"
$IPAddress = "192.168.1.51"
$Zones = Get-DnsServerZone | Where-Object { $_.ZoneType -eq "Primary" } |
Select-Object -ExpandProperty ZoneName
foreach ($Zone in $Zones) {
Get-DnsServerResourceRecord -ZoneName $Zone | Where-Object {
$_.RecordData.IPv4Address -eq $IPAddress -or
$_.RecordData.NameServer -eq $ServerFQDN -or
$_.RecordData.DomainName -eq $ServerFQDN -or
$_.RecordData.HostnameAlias -eq $ServerFQDN -or
$_.RecordData.MailExchange -eq $ServerFQDN -or
$_.HostName -eq $ServerHostname
} | Remove-DnsServerResourceRecord -ZoneName $Zone -Force -WhatIf
}
Шаг 2. Запуск PowerShell-скрипта Remove-DNSRecords
Запустите Windows PowerShell с учётными данными, имеющими необходимые права на DNS-сервере, и выполните скрипт:
C:\scripts\Remove-DNSRecords.ps1
Ниже показан пример результата выполнения скрипта.
What if: Removing DNS resource record @ of type NS from zone _msdcs.exoip.local on DC01-2022 server.
What if: Removing DNS resource record @ of type NS from zone autodiscover.exoip.com on DC01-2022 server.
What if: Removing DNS resource record dc01-2019 of type A from zone exoip.local on DC01-2022 server.
What if: Removing DNS resource record @ of type NS from zone exoip.local on DC01-2022 server.
What if: Removing DNS resource record DomainDnsZones of type A from zone exoip.local on DC01-2022 server.
What if: Removing DNS resource record _ldap._tcp.Default-First-Site-Name._sites.DomainDnsZones of type SRV from zone exoip.local on DC01-2022 server.
What if: Removing DNS resource record _ldap._tcp.Default-First-Site-Name._sites.ForestDnsZones of type SRV from zone exoip.local on DC01-2022 server.
What if: Removing DNS resource record _ldap._tcp.DomainDnsZones of type SRV from zone exoip.local on DC01-2022 server.
What if: Removing DNS resource record ForestDnsZones of type A from zone exoip.local on DC01-2022 server.
What if: Removing DNS resource record _ldap._tcp.ForestDnsZones of type SRV from zone exoip.local on DC01-2022 server.
What if: Removing DNS resource record @ of type NS from zone TrustAnchors on DC01-2022 server.
После того как вы проверили найденные DNS-записи и убедились, что они действительно относятся к нужному объекту компьютера Active Directory, удалите параметр -WhatIf из строки Remove-DnsServerResourceRecord в скрипте.
Она должна выглядеть так:
} | Remove-DnsServerResourceRecord -ZoneName $Zone -Force
После этого повторно запустите скрипт:
C:\scripts\Remove-DNSRecords.ps1
Теперь найденные DNS-записи, связанные с указанным объектом компьютера Active Directory, будут фактически удалены.
FAQ
Почему DNS-записи остаются после удаления компьютера из Active Directory?
Удаление объекта компьютера из Active Directory само по себе не гарантирует немедленное удаление связанных с ним ресурсных записей DNS. Кроме того, статические записи не удаляются механизмом Aging and Scavenging.
Можно ли удалить старые DNS-записи автоматически?
Для устаревших динамических записей можно использовать механизм DNS Aging and Scavenging. Если необходимо найти связанные записи конкретного старого сервера или удалить статические записи, можно использовать PowerShell.
Зачем в скрипте используется параметр -WhatIf?
Параметр -WhatIf показывает, какие записи команда собирается удалить, но не выполняет фактическое удаление. Это позволяет сначала проверить результат поиска.
Какие данные нужно изменить перед запуском Remove-DNSRecords.ps1?
Необходимо указать FQDN, короткое имя узла и IP-адрес сервера, DNS-записи которого требуется найти. В переменной $ServerFQDN следует сохранить точку в конце полного доменного имени.
Какие типы DNS-записей может найти скрипт?
Скрипт перебирает записи основных DNS-зон и сопоставляет их данные с указанными FQDN, именем узла и IPv4-адресом. Поэтому в результат могут попасть связанные записи разных типов, включая A, NS, SRV и другие записи, содержащие эти значения.
Можно ли сразу удалить параметр -WhatIf?
Технически можно, но делать этого не рекомендуется. Сначала безопаснее выполнить тестовый запуск с -WhatIf и убедиться, что скрипт не выбрал действующие DNS-записи.
Нужно ли запускать скрипт непосредственно на контроллере домена?
Нет, обязательного требования запускать его именно на контроллере домена нет. Главное, чтобы на компьютере были доступны командлеты модуля DNS Server, был доступ к нужному DNS-серверу и используемая учётная запись имела необходимые права.
Итог
Мы разобрали, как найти и удалить устаревшие DNS-записи с помощью PowerShell. Вместо ручного просмотра всех DNS-зон скрипт ищет связанные записи по имени компьютера, FQDN и IP-адресу.
Главное преимущество такого подхода — возможность сначала выполнить безопасную проверку с параметром -WhatIf, посмотреть все найденные записи и только после этого разрешить их фактическое удаление.
Для регулярной очистки динамических записей лучше использовать штатный механизм DNS Aging and Scavenging, а PowerShell-скрипт удобен для разовой очистки записей конкретного выведенного из эксплуатации сервера или компьютера.
Также рекомендую посмотреть статью Как экспортировать DNS-записи в CSV с помощью PowerShell.