当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] Resolve-DnsName:使用 PowerShell 解析 DNS 记录

作者:精品下载站 日期:2024-12-14 13:00:49 浏览:16 分类:玩电脑

Resolve-DnsName:使用 PowerShell 解析 DNS 记录


如果您正在管理 Web 或邮件服务器,您就会知道这些服务器对充分配置的 DNS 记录的依赖程度。丢失 DNS 记录可能会导致各种问题,包括用户无法找到您的网站或无法发送电子邮件。 PowerShell Resolve-DnsName cmdlet 的存在是一件好事,有了它,可以通过脚本自动监控 DNS 记录。

管理员的一天已经够充实的了,手动检查 DNS 记录是否可以正确解析意味着更多的手动工作。

在本文中,您将了解如何使用 Resolve-DnsName cmdlet 通过 PowerShell 查询 DNS 记录。读完本文后,您还将了解如何创建基本脚本来生成要监控的指定 DNS 记录的报告。

先决条件

本文是一个演练,如果您打算按照示例进行操作,您将需要:

  • 运行 Windows 10 或更高版本的计算机。
  • Windows PowerShell 5.1 或 PowerShell 7.0
  • 脚本编辑器,例如 Visual Studio CodeAtomNotepad++

Resolve-DnsName:PowerShell DNS 解析器

执行 DNS 查询的方法不止一种。 Resolve-DnsName cmdlet 类似于 Windows 附带的 nslookup 命令行工具,如果您更了解的话,也可以使用 dig 命令。 Linux 管理员。

一些网站提供 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 记录会得到如下所示的输出。

[玩转系统] Resolve-DnsName:使用 PowerShell 解析 DNS 记录

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

Resolve-DnsName cmdlet 与老式的 nslookup 实用程序不同。 nslookup 返回一个简单的字符串。您可以在下面的屏幕截图中看到一个示例。如果您需要解析任何这些信息,那将是一场斗争。

[玩转系统] Resolve-DnsName:使用 PowerShell 解析 DNS 记录

查询不同类型的DNS记录

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

Resolve-DnsName -Name gmail.com

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

[玩转系统] Resolve-DnsName:使用 PowerShell 解析 DNS 记录

现在,既然我们都知道 gmail.com 是 Google 电子邮件服务使用的电子邮件域,那么一定有一条与之关联的 MX 记录,对吧?好吧,无需假设何时可以使用此命令进行确认:

Resolve-DnsName -Name gmail.com -Type MX

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

[玩转系统] Resolve-DnsName:使用 PowerShell 解析 DNS 记录

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

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

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

例如,如果您想使用Google Public DNS来查找记录,您可以通过在命令中添加-Server参数来实现,类似于下面的示例。

# Google Public DNS Server IPs
$dnsServer = @('8.8.8.8','8.8.4.4')
Resolve-DnsName adamtheautomator.com -Server $dnsServer

上面命令的结果与下面屏幕截图中显示的结果类似。

[玩转系统] Resolve-DnsName:使用 PowerShell 解析 DNS 记录

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

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

  • 速度 - 某些 DNS 服务器的执行速度可能比其他服务器更快。
  • 安全性 - 某些 DNS 服务器可能比其他服务器拥有更多的安全措施来防止劫持和攻击。
  • 记录可用性 - 在大多数情况下,组织都有自己的内部 DNS 服务器,其中包含仅在内部解析的名称的区域和记录。在这种情况下,使用公共 DNS 服务器查找内部名称将会失败。

[玩转系统] Resolve-DnsName:使用 PowerShell 解析 DNS 记录

  • 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=@() 行创建一个空数组,用于存储最终结果。然后,PowerShell 使用 foreach 循环将 $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 中运行它。下面的演示显示了输出。

从上面的结果可以看出,输出是一个对象,如果您想使用下面的命令将结果导出到 CSV 等文件,该对象非常有用。

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

CSV 输出看起来类似于下面的输出。

[玩转系统] Resolve-DnsName:使用 PowerShell 解析 DNS 记录

结论

在本文中,您了解了如何使用 Resolve-DnsName cmdlet 在 PowerShell 中执行 DSN 记录查找的基础知识。您还了解了 Resolve-DnsName 与 nslookup 实用程序等其他工具的不同之处。

您已经了解了如何在脚本中使用 Resolve-DnsName 来自动执行 DNS 记录查找。这作为监控工具非常有用,可确保您了解您所管理的 DNS 记录的当前状态。

使用您的 PowerShell 脚本编写技能,可以通过添加代码来进一步增强报告脚本,以通过电子邮件自动将报告发送给指定的收件人。还可以对其进行修改以创建视觉上令人愉悦的 HTML 输出。

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

进一步阅读

  • Google 公共 DNS
  • 回归基础:了解 PowerShell 对象
  • Export-Csv:将 CSV 文件视为一等公民的 PowerShell 方式
  • PowerTip:使用 PowerShell 获取 DNS 设置
  • 使用 ConvertTo-Html 在 PowerShell 中构建 HTML 报告
  • 如何使用 PowerShell 创建 HTML 报告

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯