【问题标题】:Resolve IP address from CNAME record with Powershell使用 Powershell 从 CNAME 记录中解析 IP 地址
【发布时间】:2018-04-04 14:35:34
【问题描述】:

我的服务器最近从简单的 www.example.com A 10.10.10.10 类型结构转移到使用 CNAME 抽象......

 www.example.com   CNAME   www1.example.com
 www1.example.com      A   10.10.10.10

以前我可以使用以下方法进行 DNS 查找以获取 A 记录:

 $myHostIp = Resolve-DnsName "www.example.com" A -DnsOnly | Select-Object -first 1
 $myHostIp = $myHostIp.IP4Address

(这不适用于 CNAME 记录)。

如何获取与 CNAME 记录关联的(第一个)IP 地址?

我试过了:

 $myHostIp = Resolve-DnsName "www.example.com" A -DnsOnly | Select-Object -first 1 -Property IP4Address

但我只是得到空值。

【问题讨论】:

  • 目前手头没有可测试的 Win10/PS5 机器,但也许 Get-DnsServerResourceRecord cmdlet 可以为您提供该信息
  • @trebleCode:如果我在循环中运行它直到解析 CNAME 链,那么可以 - 但我宁愿保持脚本最小化,除非它变得相当深奥。

标签: powershell dns


【解决方案1】:

当您使用 Resolve-DnsName -Type A 查询 CNAME 时,您会收到两个响应。第一个是CNAME响应,第二个是A。

你可以清楚地看到发生了什么:

PS> Resolve-DnsName -Name 'www.google.com' -Type A -DnsOnly | Format-List -Property *


QueryType    : CNAME
Server       : forcesafesearch.google.com
NameHost     : forcesafesearch.google.com
Name         : www.google.com
Type         : CNAME
CharacterSet : Unicode
Section      : Answer
DataLength   : 8
TTL          : 228

Address      : 216.239.38.120
IPAddress    : 216.239.38.120
QueryType    : A
IP4Address   : 216.239.38.120
Name         : forcesafesearch.google.com
Type         : A
CharacterSet : Unicode
Section      : Answer
DataLength   : 4
TTL          : 228

您得到一个空值,因为第一个对象不包含名为“IP4Address”的属性,并且不存在的属性的值为空值。

试试:

$myHostIp = Resolve-DnsName -Name 'www.example.com' -Type A -DnsOnly | 
    Where-Object QueryType -eq 'A' |
    Select-Object -First 1 -ExpandProperty IP4Address

【讨论】:

  • 这看起来比我的解决方案更好,并且更好地解释了哪里出了问题 - 我需要做一些测试以确保它像看起来一样透明。
  • @symcbean 我认为这比选择第二个更干净。 CNAME 可以指向其他 CNAME。这不是一种常见(或特别好的)做法,但在技术上是允许的。您也可以使用Where-Object IP4Address -ne $null 进行过滤。如果您有一些仅支持 IPv6 的主机,那可能会更好。
  • A 记录应该始终是最后一个被返回的(就因果关系而言),但我没有看到文档说将保留排序。使用 Where-object 消除了我绝对不感兴趣的东西 - 所以我使用它和 Select-object -last 的组合
【解决方案2】:

我找到了解决办法。

Resolve-DnsName 返回两条记录,而不是之前执行的一条记录 - 第一条是用于具有空 IP 地址属性的 CNAME 记录,但第二条已正确填充,因此我将 Select-Object -first 更改为 @987654322 @。

我会留下这个问题,看看其他人是否有更聪明的解决方案。

【讨论】:

    猜你喜欢
    • 2015-03-06
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2023-04-07
    相关资源
    最近更新 更多