Администратор DNS сервера на Windows для управления сервером, DNS зонами и записями может использовать старую добрую утилиту
Dnscmd
, или воспользоваться возможностями PowerShell модуля DNSServer. В этой статье мы рассмотрим основные операцию по массовому созданию, модификации и удалению различных DNS записей и зон с помощью PowerShell.
Модуль PowerShell — DNSServer
PowerShell модуль DNSServer входит в состав RSAT. В Windows 10 RSAT устаналивается отдельно, а в Windows Server вы можете установить модуль через Server Manager (Role Administration Tools -> Dns Server Tools).
Проверим, что в системе имеется модуль PoSh DNSServer:
Get-Module DNSServer –ListAvailable
Можно вывести список команд в нем (в версии модуля на Windows Server 2012 R2 доступно более 100 команд):
Get-Module DNSServer
Управление DNS зонами из PowerShell
Выведем список зон на DNS сервере (в нашем случае это контроллер домен):
Get-DnsServerZone –ComputerName dc01
Чтобы добавить новую первичную DNS зону с именем contoso.local, выполните команду:
Add-DnsServerPrimaryZone -Name contoso.local -ReplicationScope "Forest" –PassThru
Как вы видите, была создана первичная DNS зона, интегрированная в Active Directory (isDsIntegrated=True).
Можно создать зону обратного просмотра (Lockup Zone):
Add-DnsServerPrimaryZone -NetworkId "192.168.1.0/24" -ReplicationScope Domain
Чтобы синхронизировать новую зону с другими DC в домене, выполните команду:
Sync-DnsServerZone –passthru
Выведем список записей в новой DNS зоне (она пуста):
Get-DnsServerResourceRecord -ComputerName dc01 -ZoneName contoso.local
Для удаления зоны воспользуйтесь командой:
Remove-DnsServerZone -Name contoso.local -ComputerName dc01
Эта команда также удалит все существующие DNS записи в зоне.
Управление DNS записиями с помошью модуля DNSServer
Чтобы создать новую A запись в указнаной DNS зоне, воспользуемся командой:
Add-DnsServerResourceRecordA -Name rds1 -IPv4Address 192.168.1.30 -ZoneName contoso.local -TimeToLive 01:00:00
Чтобы добавить PTR запись в обратной зоне, в предыдущей команде можно добавить параметр –CreatePtr или создать указатель вручную командлетом Add-DNSServerResourceRecordPTR:
Add-DNSServerResourceRecordPTR -ZoneName 1.168.192.in-addr.arpa -Name 30 -PTRDomainName rds1.contoso.local
Для добавления алиаса (CNAME) для определенной A записи, воспользуйтесь командой:
Add-DnsServerResourceRecordCName -ZoneName contoso.local -Name RDSFarm -HostNameAlias rds1.contoso.local
Чтобы изменить IP адрес данной A записи нужно воспользоваться довольно сложной схемой, т.к. вы не можете напрямую изменить IP адрес у DNS записи.
$NewADNS = get-DnsServerResourceRecord -Name rds1 -ZoneName contoso.local -ComputerName dc01
$OldADNS =get-DnsServerResourceRecord -Name rds1 -ZoneName contoso.local -ComputerName dc01
Теперь изменим свойство IPV4Address у объекта $NewADNS
$NewADNS.RecordData.IPv4Address = [System.Net.IPAddress]::parse('192.168.1.230')
Теперь изменим IP адрес A записи с помощью Set-DnsServerResourceRecord:
Set-DnsServerResourceRecord -NewInputObject $NewADNS -OldInputObject $OldADNS -ZoneName contoso.local -ComputerName dc01
Проверим, что IP адрес A записи изменился:
get-DnsServerResourceRecord -Name rds1 -ZoneName contoso.local
Можно вывести список DNS записей одного типа, указав тип в аргументе –RRType. Выведем список записей CNAME в зоне:
Get-DnsServerResourceRecord -ComputerName DC01 -ZoneName contoso.local -RRType CNAME
Также вы можете использовать фильтр по различным параметрам DNS записей с помощью Where-Object. Например, выведем список A записей, у которых в имени есть фраза rds.
Get-DnsServerResourceRecord -ZoneName contoso.local -RRType A | Where-Object HostName -like "*rds*"
Для удаления записей в DNS используется командлет Remove-DnsServerResourceRecord.
Например, для удаления CNAME записи, выполните:
Remove-DnsServerResourceRecord -ZoneName contoso.local -RRType CName -Name RDSFarm
Для удаления A записи:
Remove-DnsServerResourceRecord -ZoneName contoso.local -RRType A -Name rds1 –Force
Для удаления PTR записи в обратной зоне:
Remove-DnsServerResourceRecord -ZoneName “1.168.192.in-addr.arpa” -RRType “PTR” -Name “30”
Как добавить сразу несколько A / PTR записей в DNS зону с помощью PowerShell?
Допустим, вам нужно создать сразу множество A записей в определенной DNS зоне прямого просмотра. Вы можете завести их по-одной с помощью команды Add-DnsServerResourceRecordA, но гораздол проще и быстрее массово завести A записи по списку из файла.
Создайте текстовый файл NewDnsRecords.txt ч именами и IP адресами, которые вы хотите завести. Формат файла такой:
HostName, IPAddress
Чтобы завести A записи в зоне contoso.local по данным из TXT/CSV файла, воспользуйтесь следующим скриптом PowerShell:
Import-CSV "C:\PS\NewDnsRecords.txt" | %{
Add-DNSServerResourceRecordA -ZoneName contoso.local -Name $_."HostName" -IPv4Address $_."IPAddress"
}
Если нужно сразу завести записи в обратной зоне, добавьте в команду Add-DNSServerResourceRecordA параметр –CreatePtr.
Теперь с помощью консоли DNS Manager (dnsmgmt.msc) или команнды
Get-DnsServerResourceRecord -ZoneName contoso.local
убедитесь, что все A записи успешно созданы.
Если нужно массово завести PTR записи в зоне обратного просмотра создайте текстовый/csv файл со следующей структурой
octet,hostName,zoneName 65,rds5.contoso.local,1.168.192.in-addr.arpa 66,rds6.contoso.local,1.168.192.in-addr.arpa 67,rds7.contoso.local,1.168.192.in-addr.arpa.
Затем запустите такой скрипт:
Import-CSV "C:\PS\NewDnsPTRRecords.txt" | %{
Add-DNSServerResourceRecordPTR -ZoneName $_."zoneName" -Name $_."octet" -PTRDomainName $_."hostName"
}
Убедитесь, что PTR записи появились в указанной Reverse зоне DNS.
Отличная статья, большое спасибо!
Очень помогло.
А как с помощью Powershell добавить какой-нибудь УЗ права на записи DNS?
Должны работать команды Get-Acl и Set Acl (по аналогии со статьей https://winitpro.ru/index.php/2019/04/22/ntfs-razresheniya-na-papki-powershell/):
$DNSRecord = Get-DnsServerResourceRecord -ComputerName $DNSServer -ZoneName $ZoneName.ZoneName | Where-Object {$_.hostname -eq $xxxx}
$SID = xxxx
Push-Location -Path AD:\
$ACL = Get-Acl -Path $DNSRecord.DistinguishedName
$ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $SID, "GenericAll", "Allow"
$ACL.AddAccessRule($ACE)
$ACL | Set-Acl -Path $DNSRecord.DistinguishedName
Pop-Location
Попробовал в упрощенном варианте, выдает ошибку Get-ACL
Пишет, что cannot find path ‘DC=xxxx, DC=…
Возможно, что связано с тем, что я не администратор домена, у меня права выданы делегированием на нашу OU, хотя вручную наши DNS записи вижу, могу добавить права на них.
Спасибо за участие! Ограничусь сейчас ручным добавлением прав.
добрый день. компы не регистрируют ptr записи
пробую на виртуалке. если клиент (win 10/10 — без разницы) в одной сети с dns (по совместительству dhcp) сервером — проблем нет (обратная зона конечно же создана). если клиент в другой подсети, за роутером (mikrotik) — A — запись обновляется, ptr не обновляется. Включение небезопасных обновлений не помогает. И без разницы, кто указан dns сервером в этой подсети — mikrotik (который пересылает на windows dns) или сам window dns
Почему-то помогает галка «Использовать DNS-суффикс подключения при регистрации в DNS»; но когда-то точно работало без неё.
Кто является DHCP сервером для клентов в другой подсети? Я понял, что тот же Microsoft DHCP, на который пересылает запросы из удаленной сети через режим релай Mikrotik?
Посмотрите логи на DNS Server и клиентские логи в момент попыток регистрации (
ipconfig /registerdns
)