· 15 мин чтения

DNS-зоны и записи в Windows Server через PowerShell: от разовых команд до массовой автоматизации

Семёнов Евгений Сергеевич, директор АйТи Фреш. GUI dnsmgmt.msc хорош для админа, который правит одну запись в неделю. Когда нужно создать 50 A-записей из CSV-файла, обновить TTL для целой зоны или мигрировать 3 зоны с одного DC на другой — без PowerShell никак. Модуль DnsServer в Windows Server 2016-2022 покрывает 95% задач одной строкой. Собрал все команды, которые я регулярно использую за 15 лет работы с AD-сетями.

Подготовка рабочей станции

# На Windows Server с ролью DNS
Import-Module DnsServer
Get-Command -Module DnsServer | Measure-Object
# ~150 командлетов

# На Windows 10/11 (ставим RSAT DNS Tools)
Add-WindowsCapability -Online -Name "Rsat.Dns.Tools~~~~0.0.1.0"
Import-Module DnsServer

# Все команды работают с -ComputerName
Get-DnsServer -ComputerName dc01.corp.example.ru

Обзор состояния DNS-сервера

# Общие настройки
Get-DnsServerSetting -ComputerName dc01

# Список всех зон
Get-DnsServerZone -ComputerName dc01 |
  Select ZoneName, ZoneType, IsDsIntegrated, IsReverseLookupZone |
  Format-Table -AutoSize

# Forwarders
Get-DnsServerForwarder -ComputerName dc01

# Conditional forwarders
Get-DnsServerZone -ComputerName dc01 | Where ZoneType -eq "Forwarder"

# Root hints
Get-DnsServerRootHint -ComputerName dc01

Создание зон

# AD-integrated primary — для корпоративной сети в домене
Add-DnsServerPrimaryZone -Name "corp.example.ru" `
  -ReplicationScope Domain `
  -DynamicUpdate Secure

# Standalone primary (файловая) — для обособленных DNS без AD
Add-DnsServerPrimaryZone -Name "testlab.local" `
  -ZoneFile "testlab.local.dns" `
  -DynamicUpdate None

# Reverse-зона для 10.0.0.0/24
Add-DnsServerPrimaryZone -NetworkId "10.0.0.0/24" `
  -ReplicationScope Domain `
  -DynamicUpdate Secure

# Conditional forwarder для партнёрской сети
Add-DnsServerConditionalForwarderZone -Name "partner.ru" `
  -MasterServers 192.168.100.10, 192.168.100.11 `
  -ReplicationScope Domain

Работа с записями

ТипAdd-*Когда
AAdd-DnsServerResourceRecordAИмя → IPv4
AAAAAdd-DnsServerResourceRecordAAAAИмя → IPv6
CNAMEAdd-DnsServerResourceRecordCNameАлиас
MXAdd-DnsServerResourceRecordMXПочтовый сервер
TXTAdd-DnsServerResourceRecordTxtSPF, DKIM, verification
SRVAdd-DnsServerResourceRecord (-Srv)Сервисные SRV
PTRAdd-DnsServerResourceRecordPtrReverse lookup
# A-запись
Add-DnsServerResourceRecordA -Name "web01" `
  -ZoneName "corp.example.ru" `
  -IPv4Address "10.0.0.10" `
  -TimeToLive 01:00:00

# CNAME
Add-DnsServerResourceRecordCName -Name "www" `
  -ZoneName "corp.example.ru" `
  -HostNameAlias "web01.corp.example.ru"

# MX
Add-DnsServerResourceRecordMX -Name "@" `
  -ZoneName "corp.example.ru" `
  -MailExchange "mail.corp.example.ru" `
  -Preference 10

# TXT (SPF/DKIM)
Add-DnsServerResourceRecord -Txt `
  -ZoneName "corp.example.ru" `
  -Name "@" `
  -DescriptiveText "v=spf1 mx a:mail.corp.example.ru include:_spf.yandex.ru -all"

# PTR для reverse
Add-DnsServerResourceRecordPtr -Name "10" `
  -ZoneName "0.0.10.in-addr.arpa" `
  -PtrDomainName "web01.corp.example.ru"

Поиск и фильтрация записей

# Все записи одной зоны
Get-DnsServerResourceRecord -ZoneName "corp.example.ru"

# Только A-записи
Get-DnsServerResourceRecord -ZoneName "corp.example.ru" -RRType A

# Конкретное имя
Get-DnsServerResourceRecord -ZoneName "corp.example.ru" -Name "web01"

# Записи со старым TTL
Get-DnsServerResourceRecord -ZoneName "corp.example.ru" |
  Where TimeToLive.TotalHours -lt 1 |
  Select HostName, TimeToLive

Массовое создание из CSV

# CSV: Name,Type,Value,TTL
# web01,A,10.0.0.10,3600
# www,CNAME,web01.corp.example.ru,3600

$records = Import-Csv C:\Install\dns-bulk.csv
foreach ($r in $records) {
  switch ($r.Type) {
    'A' {
      Add-DnsServerResourceRecordA `
        -Name $r.Name -ZoneName "corp.example.ru" `
        -IPv4Address $r.Value `
        -TimeToLive (New-TimeSpan -Seconds [int]$r.TTL) -PassThru
    }
    'CNAME' {
      Add-DnsServerResourceRecordCName `
        -Name $r.Name -ZoneName "corp.example.ru" `
        -HostNameAlias $r.Value `
        -TimeToLive (New-TimeSpan -Seconds [int]$r.TTL) -PassThru
    }
  }
}

Обновление существующих записей

# Правка TTL и IP у A-записи
$old = Get-DnsServerResourceRecord -ZoneName "corp.example.ru" `
  -Name "web01" -RRType A
$new = $old.Clone()
$new.RecordData.IPv4Address = [IPAddress]"10.0.0.55"
$new.TimeToLive = New-TimeSpan -Hours 4

Set-DnsServerResourceRecord -NewInputObject $new `
  -OldInputObject $old -ZoneName "corp.example.ru"

# Массовое изменение TTL всей зоны
Get-DnsServerResourceRecord -ZoneName "corp.example.ru" -RRType A |
  ForEach-Object {
    $new = $_.Clone()
    $new.TimeToLive = New-TimeSpan -Hours 1
    Set-DnsServerResourceRecord -NewInputObject $new `
      -OldInputObject $_ -ZoneName "corp.example.ru"
  }

Удаление записей

# По имени
Remove-DnsServerResourceRecord -ZoneName "corp.example.ru" `
  -Name "oldserver" -RRType A -Force

# По записи
$rec = Get-DnsServerResourceRecord -ZoneName "corp.example.ru" -Name "web05"
$rec | Remove-DnsServerResourceRecord -ZoneName "corp.example.ru" -Force

Scavenging — уборка устаревших записей

# Включить scavenging на сервере
Set-DnsServerScavenging -ComputerName dc01 `
  -ScavengingState $true `
  -ScavengingInterval 7.00:00:00 `
  -RefreshInterval 7.00:00:00 `
  -NoRefreshInterval 7.00:00:00

# Включить для конкретной зоны
Set-DnsServerZoneAging -Name "corp.example.ru" `
  -ComputerName dc01 `
  -Aging $true

# Принудительно запустить сейчас
Start-DnsServerScavenging -ComputerName dc01 -Force

Я всегда включаю scavenging на зонах с DynamicUpdate — иначе через пару лет в зоне плодятся тысячи мёртвых записей от уволенных сотрудников и списанных ноутбуков.

Диагностика

# Проверка резолвинга
Resolve-DnsName www.corp.example.ru -Server dc01
Resolve-DnsName www.corp.example.ru -DnsOnly -NoHostsFile

# Интерактивная проверка сервера
Test-DnsServer -IPAddress 10.0.0.1 -ZoneName "corp.example.ru"

# Здоровье SYSVOL-репликации зон
dcdiag /test:dns /dnsall /s:dc01

# Включение расширенных логов
Set-DnsServerDiagnostics -ComputerName dc01 `
  -Queries $true -Answers $true `
  -Notifications $true `
  -Update $true -ReceivePackets $true `
  -SendPackets $true -TcpPackets $true -UdpPackets $true `
  -LogFilePath "C:\DNS\dns.log" -MaxMBFileSize 500MB

# Проверка кэша
Get-DnsServerCache -ComputerName dc01
Clear-DnsServerCache -ComputerName dc01 -Force

Экспорт и импорт зоны

# Экспорт зоны в файл (только для primary)
Export-DnsServerZone -Name "corp.example.ru" `
  -FileName "corp.example.ru.export" `
  -ComputerName dc01

# Файл оказывается в C:\Windows\System32\DNS\corp.example.ru.export

# Импорт зоны
Add-DnsServerPrimaryZone -Name "restored.local" `
  -ZoneFile "corp.example.ru.export"

Реальный кейс: миграция 4 зон на новые DC

В августе 2025 клиент — ИТ-интегратор с 12-летним доменом на Server 2012 R2. Задача: поднять два новых DC на Server 2022 в дата-центре МТС Москва (наши Dell Xeon Platinum 8280), перенести 4 AD-integrated DNS-зоны (основная корпоративная и 3 партнёрских), затем отключить старые DC без даунтайма.

Сделали за два плановых окна. В первом — поставили DC03/DC04 в новом сайте, включили в репликацию, добавили роли DNS. AD-integrated зоны реплицировались автоматически. Проверили PowerShell-ом:

# Серверы, где активна зона
Get-DnsServerZone -Name "corp.example.ru" -ComputerName dc03 |
  Select ZoneName, ReplicationScope, MasterServers

# Сверка количества записей
(Get-DnsServerResourceRecord -ZoneName "corp.example.ru" `
   -ComputerName dc03).Count
(Get-DnsServerResourceRecord -ZoneName "corp.example.ru" `
   -ComputerName dc01).Count

# Все клиенты, зарегистрировавшиеся в DNS за последние 7 дней
Get-DnsServerResourceRecord -ZoneName "corp.example.ru" -RRType A |
  Where TimeStamp -gt (Get-Date).AddDays(-7) |
  Measure-Object

Во втором окне — обновили DHCP на выдачу новых DC в качестве DNS, мониторили 72 часа, затем вывели старые DC из AD. Весь проект — 9 рабочих дней, 120 000 руб., ни одной жалобы от пользователей. Сопровождение продолжаем сейчас.

Полезные командлеты, которые экономят время

Поможем автоматизировать DNS в AD-сети

Пишу PowerShell-скрипты для массовой работы с DNS, мигрирую зоны между серверами, настраиваю scavenging и мониторинг. Опыт 15+ лет с AD-доменами размером от 30 до 800 рабочих мест. Первичная консультация и оценка — бесплатно.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — вопросы о Windows DNS и PowerShell

Какой модуль PowerShell нужен для DNS?
Модуль DnsServer, входит в состав RSAT DNS Server Tools и в Windows Server с ролью DNS.
Можно ли управлять удалённо не-DC сервером DNS?
Да, через параметр -ComputerName. Нужны права администратора и открытый RPC 135.
Как массово создать много A-записей?
Через импорт CSV и цикл с Add-DnsServerResourceRecordA. Для 500+ записей лучше делать в AD-integrated зону.
Чем отличаются primary и AD-integrated зоны?
Primary хранится в файле и реплицируется Zone Transfer. AD-integrated — в AD-партишене с нативной репликацией.
Как диагностировать проблемы с DNS?
Get-DnsServerDiagnostics, dcdiag /test:dns, Resolve-DnsName, Test-DnsServer — основные инструменты.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.