Resolve-DnsName: PowerShell 中的主 DNS 记录查找

如果您管理网络或邮件服务器,您就知道这些服务器在充分配置的DNS记录上有多么依赖。缺少DNS记录可能会导致各种问题,包括用户无法找到您的网站或邮件无法投递。幸运的是,PowerShell的Resolve-DnsName cmdlet存在,通过脚本编写,可以自动监视DNS记录。

管理员的一天已经充实到足够了,手动检查DNS记录是否能够适当解析意味着更多的手动工作。

在这篇文章中,您将了解如何使用Resolve-DnsName cmdlet通过PowerShell查询DNS记录。到本文结束时,您还将学会如何创建一个基本脚本,以制作您提名的DNS记录监视报告。

先决条件

本文是一个操作指南,如果您计划跟随示例进行,您将需要:

Resolve-DnsName: PowerShell DNS解析器

执行DNS查询的方法不止一种。Resolve-DnsName cmdlet类似于随Windows一起提供的nslookup命令行工具,或者如果您更喜欢Linux管理员,则类似于dig命令

一些网站提供DNS记录监控/报告服务。但是,这些第三方服务大多需要付费。当然,也有免费的替代方案,它还允许您展示您的脚本编写技能!

Resolve-DnsName cmdlet,顾名思义,将DNS名称解析为IP地址,反之亦然。该cmdlet是 dnsclient PowerShell模块的一部分,截至本文撰写时,该模块已随Windows 10、Windows Server 2012/R2、Windows Server 2016和Windows Server 2019一起发布。

因为Resolve-DnsName是一个PowerShell cmdlet,它将结果作为可以存储、操作和导出的对象返回。例如,使用命令Resolve-DnsName google.com查找google.com的DNS记录将给出以下输出。

DNS Record lookup result using Resolve-DnsName

结果以一个对象的形式返回,该对象允许您将结果导出到CSV文件,或者操纵格式以生成HTML报告。

Resolve-DnsName cmdlet与老式的nslookup工具不同。nslookup返回一个简单的字符串。您可以在以下屏幕截图中看到一个例子。如果您需要解析出其中的任何信息,那将是一项挑战。

DNS record lookup result using nslookup

查询不同类型的DNS记录

默认情况下,Resolve-DnsName查询A和AAAA DNS记录类型。例如,如果您使用以下命令查找gmail.com的DNS记录:

Resolve-DnsName -Name gmail.com

如下所示,只返回AAAA和A记录。这是因为未指定要查找的DNS记录类型。

DNS record for gmail.com

现在,我们都知道gmail.com是谷歌电子邮件服务使用的电子邮件域,那么它肯定有一个与之关联的MX记录,对吗?好吧,您可以使用以下命令确认,而不是假设:

Resolve-DnsName -Name gmail.com -Type MX

下面的屏幕截图显示了gmail.com的MX记录列表。

MX Record list of gmail.com

要了解有关可以与Resolve-DnsName一起使用的不同记录类型的更多信息,请访问此链接并查找-Type参数的表。或者,您可以使用命令get-help Resolve-DnsName参考Resolve-DnsName帮助。

使用特定服务器进行DNS查找

Resolve-DnsName 默认使用计算机上配置的 DNS 服务器地址。但是,您也可以通过在执行查找时使用特定的 DNS 服务器来使Resolve-DnsName

例如,如果您想使用Google 公共 DNS来查找记录,您可以通过在命令中添加-Server参数来执行此操作,类似于下面的示例。

# Google 公共 DNS 服务器 IP
$dnsServer = @('8.8.8.8','8.8.4.4')
Resolve-DnsName adamtheautomator.com -Server $dnsServer

上述命令的结果将类似于下面截图中显示的结果。

DNS record lookup results using a specific DNS servers

这时,您可能会问:“为什么我需要使用不同的 DNS 服务器?” 这是一个合理的问题。如果您尝试使用计算机的默认 DNS 服务器或另一个 DNS 服务器查找相同的记录,您可能会得到相同的结果。

使用不同的 DNS 服务器与Resolve-DnsName可能有许多原因。其中一些原因可能包括:

  • 速度 – 一些 DNS 服务器可能比其他服务器更快。
  • 安全性 – 一些 DNS 服务器可能具有比其他服务器更多的安全措施,可以防止劫持和攻击。
  • 记录可用性 – 在大多数情况下,组织都有自己的内部DNS服务器,其中包含仅在内部解析的名称的区域和记录。在这种情况下,使用公共DNS服务器查找内部名称将失败。
DNS record lookup failure
  • DNS服务器不会转发请求 – 一些组织不允许DNS转发。使用它们来查找公共DNS记录的DNS查找将失败。
  • 故障排除和测试 – 当你喜欢的DNS服务器出现问题时,你可能想要使用不同的DNS服务器来测试你的查找。

使用PowerShell脚本报告DNS记录

现在,你已经学会了如何使用Resolve-DnsName cmdlet的基础知识,在这一部分中,你将学习创建一个PowerShell脚本来监视和报告DNS记录。到目前为止,你应该能够应用你在前面各节中所学到的知识来构建这个脚本。

启动你喜欢的脚本编辑器,并创建一个名为GetDnsRecord.ps1的新文件。

定义变量

首先,确定要使用的变量。这些变量将包括以下内容:

  • $NameList – 这个变量将保存你希望你的脚本查询的DNS记录的名称
  • $Serverlist – 使用这个变量来指示脚本将用于查找的DNS服务器。

复制下面的代码并将其粘贴到你的脚本的开头。

$NameList = @('adamtheautomator.com','powershell.org','xyz.local')
$ServerList = @('8.8.8.8','8.8.4.4')

执行DNS查找

接下来,代码必须能够查找指定名称的DNS记录。在这种情况下,将使用foreach循环来迭代记录列表,并使用Resolve-DnsName查找每个名称。

$FinalResult = @()创建一个空数组,最终结果将存储在其中。然后,使用foreach循环,PowerShell将$NameList变量中的每个项目传递给名为$Name的变量。

在每次迭代中,行$tempObj = "" | Select-Object Name,IPAddress,Status,ErrorMessage创建一个临时对象,其中包含四个属性,用于保存成功DNS查找的结果。

接下来,使用try{}语句运行Resolve-DnsName命令来查找DNS A记录并填充$tempObj的值。如果DNS查找失败,则catch{}语句捕获错误,并将错误包含在$tempObj对象中。

在每次迭代结束时,$tempObj对象的值将附加到$FinalResult中。一旦处理完$NameList数组中的最后一个项目,循环将退出。然后,将显示$FinalResult的值。

复制下面的代码,并将其粘贴到脚本的末尾。不需要更改任何值。

$FinalResult = @()
foreach ($Name in $NameList) {
    $tempObj = "" | Select-Object Name, IPAddress, Status, ErrorMessage
    try {
        $dnsRecord = Resolve-DnsName $Name -Server $ServerList -ErrorAction Stop | Where-Object { $_.Type -eq 'A' }
        $tempObj.Name = $Name
        $tempObj.IPAddress = ($dnsRecord.IPAddress -join ',')
        $tempObj.Status = 'OK'
        $tempObj.ErrorMessage = ''
    }
    catch {
        $tempObj.Name = $Name
        $tempObj.IPAddress = ''
        $tempObj.Status = 'NOT_OK'
        $tempObj.ErrorMessage = $_.Exception.Message
    }
    $FinalResult += $tempObj
}
return $FinalResult

保存脚本后,通过调用其名称GetDnsRecord.ps1在PowerShell中运行它。下面的演示显示了输出。

Script to lookup multiple DNS records using Resolve-DnsName

正如您从上面的结果中所看到的那样,输出是一个对象,如果您想使用以下命令将结果导出到CSV文件中,这将非常有用。

.\GetDnsRecord.ps1 | Export-Csv DnsRecord.csv -NoTypeInformation

CSV输出将类似于下面的内容。

DNS record lookup report exported to a CSV file

结论

在本文中,您已经学习了如何使用Resolve-DnsName cmdlet在PowerShell中执行DNS记录查找的基础知识。您还了解了Resolve-DnsName与nslookup实用程序等其他工具的区别。

您已经看到了如何在脚本中使用Resolve-DnsName来自动化DNS记录查找。这将作为监控工具非常有用,以确保您了解您关注的DNS记录的当前状态。

利用您的PowerShell脚本技能,可以通过添加代码来进一步增强报告脚本,以自动将报告通过电子邮件发送给指定的收件人。也可以修改为创建外观美观的HTML输出。

最后,Resolve-DnsName是一个出色的DNS查找工具,无论您是手动使用还是在脚本中进行自动化。现在您已经了解了它的工作原理,可以自行找到将其用作管理任务一部分的方法。

进一步阅读

Source:
https://adamtheautomator.com/resolve-dnsname/