DOC / 1440 SysAdminHub.ru

Как удалить устаревшие DNS-записи с помощью PowerShell

Как удалить устаревшие DNS-записи с помощью PowerShell

Что такое 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).

Свойства DNS-зоны в Диспетчере DNS Windows Server

Перейдите на вкладку Серверы имен (Name Servers).

В списке присутствует старый сервер. Это означает, что для него в DNS-зоне по-прежнему существует запись типа NS (Name Server).

Устаревший DNS-сервер в списке серверов имен зоны

В DNS-зоне также присутствует запись узла типа A (Host) для старого сервера.

Устаревшая A-запись старого сервера в DNS-зоне

В DNS-зоне также присутствует запись типа SRV (Service Location), связанная со старым сервером.

Устаревшая SRV-запись старого контроллера домена

Если продолжить проверку остальных DNS-зон, можно обнаружить и другие устаревшие записи, связанные с этим объектом компьютера Active Directory.

Просматривать все DNS-зоны и вручную удалять старые записи долго и неудобно. Кроме того, некоторые записи легко пропустить, в результате чего они продолжат храниться на DNS-сервере.

Вместо ручной проверки каждой зоны автоматизируем этот процесс с помощью PowerShell. Скрипт позволит найти и удалить устаревшие DNS-записи, связанные с нужным объектом компьютера Active Directory.

Удаление устаревших DNS-записей с помощью PowerShell

Для автоматического удаления старых DNS-записей можно использовать PowerShell-скрипт Remove-DNSRecords.ps1.

В своей работе он использует три основных командлета:

  1. Get-DnsServerZone — получает список основных DNS-зон.
  2. Get-DnsServerResourceRecord — ищет ресурсные записи, соответствующие указанным FQDN, Hostname и IP-адресу.
  3. 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.

ORIGINAL / ATTRIBUTION

Источник материала

Материал взят с https://sysadminhub.ru/. Оригинальная статья и авторство указаны по ссылке ниже.

Оригинал статьи на SysAdminHub.ru ↗

https://sysadminhub.ru/produkty-microsoft/windows-server/clean-up-dns-records-powershell

Материал проверен 10.10.2026. При изменении программного обеспечения сверяйтесь с актуальной документацией.
← Вернуться в базу знаний