使用 Powershell 从 DNS 管理器导出所有主机

使用 Powershell 从 DNS 管理器导出所有主机

虽然我对 powerShell v3 还不太熟悉,但我可以用它做一些事情,但是,有一件事我一直搞不清楚,那就是如何提取 DNS 管理器 (Server 2008 R2) 中列出的所有主机。我不需要设置或删除任何内容,只需让它将列表查询到文本文件中即可。令人惊讶的是,我没有找到这样做的方法。有人知道怎么做吗?

答案1

我以前使用过 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}

答案2

我还没有看到提到的另一种方法:

Get-WmiObject -Namespace Root\MicrosoftDNS -Query "SELECT * FROM MicrosoftDNS_AType WHERE ContainerName='domain.com'"

当您由于某种原因无法下载 DnsShell 时,或者当您使用的 Powershell 版本较旧且没有内置的 Cmdlet 时,或者当您的目标系统是 Windows Server 的较旧版本时,WMI 是很好的选择。

答案3

Windows Server 2012、Powershell v3 中提供的 DnsServer 模块有以下命令可能对您有用:

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

相关内容