如果您管理网络或邮件服务器,您就知道这些服务器在充分配置的DNS记录上有多么依赖。缺少DNS记录可能会导致各种问题,包括用户无法找到您的网站或邮件无法投递。幸运的是,PowerShell的Resolve-DnsName cmdlet存在,通过脚本编写,可以自动监视DNS记录。
管理员的一天已经充实到足够了,手动检查DNS记录是否能够适当解析意味着更多的手动工作。
在这篇文章中,您将了解如何使用Resolve-DnsName
cmdlet通过PowerShell查询DNS记录。到本文结束时,您还将学会如何创建一个基本脚本,以制作您提名的DNS记录监视报告。
先决条件
本文是一个操作指南,如果您计划跟随示例进行,您将需要:
- A computer running Windows 10 or above.
- Windows PowerShell 5.1或PowerShell 7.0
- A script editor such as Visual Studio Code, Atom, or Notepad++.
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记录将给出以下输出。

结果以一个对象的形式返回,该对象允许您将结果导出到CSV文件,或者操纵格式以生成HTML报告。
Resolve-DnsName
cmdlet与老式的nslookup
工具不同。nslookup
返回一个简单的字符串。您可以在以下屏幕截图中看到一个例子。如果您需要解析出其中的任何信息,那将是一项挑战。

查询不同类型的DNS记录
默认情况下,Resolve-DnsName
查询A和AAAA DNS记录类型。例如,如果您使用以下命令查找gmail.com
的DNS记录:
如下所示,只返回AAAA和A记录。这是因为未指定要查找的DNS记录类型。

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

要了解有关可以与
Resolve-DnsName
一起使用的不同记录类型的更多信息,请访问此链接并查找-Type
参数的表。或者,您可以使用命令get-help Resolve-DnsName
参考Resolve-DnsName帮助。
使用特定服务器进行DNS查找
Resolve-DnsName
默认使用计算机上配置的 DNS 服务器地址。但是,您也可以通过在执行查找时使用特定的 DNS 服务器来使Resolve-DnsName
。
例如,如果您想使用Google 公共 DNS来查找记录,您可以通过在命令中添加-Server
参数来执行此操作,类似于下面的示例。
上述命令的结果将类似于下面截图中显示的结果。

这时,您可能会问:“为什么我需要使用不同的 DNS 服务器?” 这是一个合理的问题。如果您尝试使用计算机的默认 DNS 服务器或另一个 DNS 服务器查找相同的记录,您可能会得到相同的结果。
使用不同的 DNS 服务器与Resolve-DnsName
可能有许多原因。其中一些原因可能包括:
- 速度 – 一些 DNS 服务器可能比其他服务器更快。
- 安全性 – 一些 DNS 服务器可能具有比其他服务器更多的安全措施,可以防止劫持和攻击。
- 记录可用性 – 在大多数情况下,组织都有自己的内部DNS服务器,其中包含仅在内部解析的名称的区域和记录。在这种情况下,使用公共DNS服务器查找内部名称将失败。

- DNS服务器不会转发请求 – 一些组织不允许DNS转发。使用它们来查找公共DNS记录的DNS查找将失败。
- 故障排除和测试 – 当你喜欢的DNS服务器出现问题时,你可能想要使用不同的DNS服务器来测试你的查找。
使用PowerShell脚本报告DNS记录
现在,你已经学会了如何使用Resolve-DnsName
cmdlet的基础知识,在这一部分中,你将学习创建一个PowerShell脚本来监视和报告DNS记录。到目前为止,你应该能够应用你在前面各节中所学到的知识来构建这个脚本。
启动你喜欢的脚本编辑器,并创建一个名为GetDnsRecord.ps1的新文件。
定义变量
首先,确定要使用的变量。这些变量将包括以下内容:
$NameList
– 这个变量将保存你希望你的脚本查询的DNS记录的名称$Serverlist
– 使用这个变量来指示脚本将用于查找的DNS服务器。
复制下面的代码并将其粘贴到你的脚本的开头。
执行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
的值。
复制下面的代码,并将其粘贴到脚本的末尾。不需要更改任何值。
保存脚本后,通过调用其名称GetDnsRecord.ps1在PowerShell中运行它。下面的演示显示了输出。

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

结论
在本文中,您已经学习了如何使用Resolve-DnsName
cmdlet在PowerShell中执行DNS记录查找的基础知识。您还了解了Resolve-DnsName
与nslookup实用程序等其他工具的区别。
您已经看到了如何在脚本中使用Resolve-DnsName
来自动化DNS记录查找。这将作为监控工具非常有用,以确保您了解您关注的DNS记录的当前状态。
利用您的PowerShell脚本技能,可以通过添加代码来进一步增强报告脚本,以自动将报告通过电子邮件发送给指定的收件人。也可以修改为创建外观美观的HTML输出。
最后,Resolve-DnsName
是一个出色的DNS查找工具,无论您是手动使用还是在脚本中进行自动化。现在您已经了解了它的工作原理,可以自行找到将其用作管理任务一部分的方法。