Resolve-DnsName:在PowerShell中查找DNS記錄的大師

如果您管理网络或邮件服务器,您就知道这些服务器如何严重依赖于正确配置的DNS记录。缺少DNS记录可能会导致各种问题,包括用户无法找到您的网站或无法投递电子邮件。幸好有PowerShell的Resolve-DnsName命令,通过脚本化可以自动监控DNS记录。

管理员的工作已经很忙了,手动检查DNS记录是否能够正确解析意味着额外的手动工作。

在本文中,您将学习如何使用Resolve-DnsName cmdlet和PowerShell查询DNS记录。通过本文的学习,您还将学会如何创建一个基本脚本来生成所选DNS记录的监控报告。

先决条件

本文是一个逐步指南,如果您打算按照示例进行操作,您将需要:

Resolve-DnsName: PowerShell DNS解析器

执行DNS查询有多种方法。Resolve-DnsName cmdlet类似于Windows附带的nslookup命令行工具,或者如果您是Linux管理员,类似于dig命令

一些網站提供DNS記錄監測/報告服務。但這些第三方服務大多需要付費。當然,還有一個免費的替代方案,同時也可以展示你的腳本技能!

這個Resolve-DnsName命令,正如其名,可以解析DNS名稱為IP地址,反之亦然。這個命令是dnsclient PowerShell 模組的一部分。就目前而言,該模組隨附於Windows 10、Windows Server 2012/R2、Windows Server 2016和Windows Server 2019。

由於Resolve-DnsName是一個PowerShell命令,它返回的結果是可以存儲、操作和導出的對象。例如,使用命令Resolve-DnsName google.com查詢google.com的DNS記錄,將獲得如下所示的輸出結果。

DNS Record lookup result using Resolve-DnsName

結果以對象形式返回,可以將結果導出為CSV文件,或者根據需要調整格式以生成HTML報告。

Resolve-DnsName命令與傳統的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是Google郵件服務使用的郵件域,肯定有一個與之關聯的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 伺服器位址。但是,當進行查詢時,您也可以讓 Resolve-DnsName 使用特定的 DNS 伺服器。

例如,如果您想使用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伺服器來測試你的查找。

使用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/