Хотя я новичок в PowerShell v3, кое-что я могу с ним сделать, однако одна вещь, которая ускользнула от меня, - это как извлечь все хосты, перечисленные в нашем диспетчере DNS (Server 2008 R2). Мне не нужно ничего устанавливать или удалять, просто запишите список в текстовый файл. Удивительно, но я не нахожу способа сделать это. Кто-нибудь знает, как это сделать, пожалуйста?
Другой метод, о котором я пока не упоминал:
Get-WmiObject -Namespace Root\MicrosoftDNS -Query "SELECT * FROM MicrosoftDNS_AType WHERE ContainerName='domain.com'"
WMI полезно помнить, когда вы не можете загрузить DnsShell по какой-либо причине, или если вы используете более старую версию Powershell, в которой нет встроенных командлетов, или если вы ориентируетесь на старую версию Windows Server .
Раньше я использовал DNSShell. http://dnsshell.codeplex.com/. Чтобы получить все записи A в зоне, вы можете сделать это:
Get-DnsRecord -RecordType A -ZoneName FQDN -Server ServerName
Чтобы записать это в текстовый файл:
Get-DnsRecord -RecordType A -ZoneName FQDN -Server ServerName | % {Add-Content -Value $_ -Path filename.txt}
Модуль DnsServer, доступный в Windows Server 2012, Powershell v3, имеет следующие команды, которые могут быть вам полезны:
Get-DnsServerZone
Get-DnsServerResourceRecord
В первом вы получите все зоны, а во втором - записи для любой зоны, которую вы ему передадите.
Они в основном эквивалентны DNSCMD. /EnumZones
и /EnumRecords
.
Итак ... Вы можете написать что-то вроде этого, чтобы получить ВСЕ записи из ВСЕХ зон:
$Zones = @(Get-DnsServerZone)
ForEach ($Zone in $Zones) {
Write-Host "`n$Zone.ZoneName" -ForegroundColor "Yellow"
$Zone | Get-DnsServerResourceRecord
}
Кроме того, я почти уверен, что сервер 2012 теперь хранит фактический файл зоны для каждой зоны? Таким образом, у вас должна быть копия файла для всех ваших зон.
Если вы работаете с 2008 R2, вы можете использовать этот сценарий, который я использую для резервного копирования всех своих зон в файлы:
$zones = @( `
dnscmd /enumzones | `
select-string -pattern "\b(?i)((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b" | %{$_.Matches} | %{$_.Value};
);
ForEach ($domain in $zones) {
$backup = "dnscmd . /zoneExport $domain $domain";
Invoke-Expression $backup | Out-Null
Write-Host "Backing up $domain" -ForegroundColor "White"
};
ForEach ($item in (gci C:\Windows\System32\dns)) {
Write-Host "Renaming $item" -ForegroundColor "White"
Rename-item $item.fullname ([string]$item + ".dns")
}
Write-Host "Back up complete." -ForegroundColor "Cyan"
cmd /c pause | out-null