使用PowerShell从主机名解析IP地址

60

我正在使用Powershell尝试从主机名获取IP地址,但我真的搞不明白该怎么做。

有什么帮助吗?


我没有Windows机器,所以不能确定,但是nslookup或dig中的一个可用吗? - Roger Lindsjö
12个回答

84
您可以像这样使用GetHostAddresses来获取所有IP地址:
$ips = [System.Net.Dns]::GetHostAddresses("yourhosthere")

您可以像这样迭代它们:

[System.Net.Dns]::GetHostAddresses("yourhosthere") | foreach {echo $_.IPAddressToString }

一个服务器可能有多个IP地址,因此这将返回一个IP地址数组。

4
如果你确信能够解析,$ip = [System.Net.Dns]::GetHostAddresses("yourhosthere")[0] 将确保你只获取一个IP地址。 - Bjørn van Dommelen

40

这很好而且简单,并获取所有节点。

$ip = Resolve-DNSName google.com
$ip

也可以尝试输入IP地址而不是域名,查看那些结果!


在底层,这与[System.Net.Dns] :: GetHostAddresses有何不同? - Castrohenge
如果您想使用此方法仅访问IP地址,请使用$ip.IPAddress。请注意,如果有多个IP,则会返回一个数组。 - Andy Fraley
1
Resolve-DnsName 不是 PowerShell Core / PowerShell 7 的一部分,因此为了跨平台,您需要使用 System.Net.Dns.GetHostAddresses - Carl Walsh
[System.Net.Dns] :: GetHostAddresses("yourhosthere")不同,这个方法会有一点延迟(在我的情况下大约是一秒钟)。 - YakovL
@Castrohenge,有趣的是,当Resolve-DNSName被设置为SkipAsSource时(例如在hosts中指定),它可以成功地获取IP地址,而GetHostAddresses()则失败。 - Hashbrown

20

使用Resolve-DnsName cmdlet。

Resolve-DnsName computername | FT Name, IPAddress -HideTableHeaders | Out-File -Append c:\filename.txt

PS C:\> Resolve-DnsName stackoverflow.com

Name                                           Type   TTL   Section    IPAddress
----                                           ----   ---   -------    ---------
stackoverflow.com                              A      130   Answer     151.101.65.69
stackoverflow.com                              A      130   Answer     151.101.129.69
stackoverflow.com                              A      130   Answer     151.101.193.69
stackoverflow.com                              A      130   Answer     151.101.1.69

PS C:\> Resolve-DnsName stackoverflow.com | Format-Table Name, IPAddress -HideTableHeaders

stackoverflow.com 151.101.65.69
stackoverflow.com 151.101.1.69
stackoverflow.com 151.101.193.69
stackoverflow.com 151.101.129.69

PS C:\> Resolve-DnsName -Type A google.com

Name                                           Type   TTL   Section    IPAddress
----                                           ----   ---   -------    ---------
google.com                                     A      16    Answer     216.58.193.78


PS C:\> Resolve-DnsName -Type AAAA google.com

Name                                           Type   TTL   Section    IPAddress
----                                           ----   ---   -------    ---------
google.com                                     AAAA   223   Answer     2607:f8b0:400e:c04::64

3
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答该问题的额外上下文信息可以提高其长期价值。 - Jack

10
你可以使用vcsjones的解决方案,但这可能会导致进一步ping/tracert命令出现问题,因为结果是一个地址数组,你只需要其中一个。
要选择正确的地址,请发送 一个ICMP回显请求并读取回显响应的Address属性:
$ping = New-Object System.Net.NetworkInformation.Ping
$ip = $($ping.Send("yourhosthere").Address).IPAddressToString

虽然文档中的注释说:

通过任何Send重载返回的Address可能来自恶意远程计算机。不要使用此地址连接到远程计算机。请使用DNS确定您想要连接的计算机的IP地址。


@Backwards_Dave,显然我在这里使用括号来分组项目的习惯过度了。下一行更新后的代码可以让你获得相同的结果,而不需要额外的$(...):$ips = $ping.Send("yourhosthere").Address.IPAddressToString感谢您的提问。简单就是美... - Robbie P
这在Windows上运行良好,但在Ubuntu上运行Powershell 7.0.3时,返回的记录实际上是空的,并报告了一个IP地址为0.0.0.0。 - Taegost
看起来你无法控制获得v6还是v4地址。 - Ouroborus

4

如果您想从集合中获取单个结果,则可以使用以下一行代码:

$ipAddy = [System.Net.Dns]::GetHostAddresses("yahoo.com")[0].IPAddressToString; 

hth


1
我可以确认这种方法在运行于Ubuntu 20.04的Powershell和Powershell 7.0.3中都能够正常工作,而且它似乎比我测试过的所有其他方法都要快得多。 - Taegost

2

如果您知道子网的一部分(例如此示例中的10.3),则会获取给定子网中的任何地址:

PS C:\> [System.Net.Dns]::GetHostAddresses("MyPC") | foreach { $_.IPAddressToString | findstr "10.3."}

1

1
$computername = $env:computername    
[System.Net.Dns]::GetHostAddresses($computername)  | where {$_.AddressFamily -notlike "InterNetworkV6"} | foreach {echo $_.IPAddressToString }

2
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - JAL

1

这对我的目的非常有效

$ping = ping -4 $env:COMPUTERNAME
$ip = $ping.Item(2)
$ip = $ip.Substring(11,11)

1
在运行于Ubuntu 20.04的PowerShell 7.0.3中,此方法无效,它会在收到任何响应之前挂起。 - Taegost

0

如果你有一个主机列表的文本文件,你可以使用这段代码。

$a = get-content "C:\Users\host.txt"(file path) 

foreach ($i in $a )
    {
$i + "`n" + "==========================";[System.Net.Dns]::GetHostAddresses($i) 

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接