有没有一种方法可以从IP地址获取主机名而不依赖于DNS查询?

14

我正在尝试编写一个脚本,该脚本取决于了解网络段上计算机的名称,但是我找到的所有脚本都依赖于 DNS 查询,它只会回复一些机器的名称。例如:

[System.Net.Dns]::GetHostbyAddress($IPAddress) 

我也尝试过使用。
Ping -a $ipaddress

但是这样通常无法返回计算机名称。有没有一种方法可以直接询问主机它的名称以及在活动目录中需要什么级别的权限才能获得响应?
提前感谢。


2
DNS是获取IP>名称转换的方式,另一个选项是使用有效凭据远程连接到机器,然后在本地检查主机名。如果您无法通过DNS检索名称,则请检查它是否正在使用您的DHCP / DNS并且您正在查询正确的服务器,或者该设备是否有手动DNS条目。 - colsw
2
NetBIOS可能是一个选项,但DNS绝对是正确的选择。 - Mathias R. Jessen
你确定所有的IP地址都在你的DNS中列出了吗? - Dave
正如其他帖子中提到的,DNS和WINS / NetBios是两种名称服务。您可以使用nbtstat查看NetBios缓存,但实际上DNS是正确的技术工具。与其尝试寻找替代查询,解决DNS问题应该是第一优先事项。我会检查DHCP范围是否设置为动态更新DNS,并且它还会动态更新未请求更新的客户端。 - BenH
1
由于您正在使用AD,因此只有一种方法:DNS。 AD依赖于DNS。 DNS问题也会影响AD,应始终得到修复。 - bluuf
显示剩余2条评论
6个回答

8

[System.Net.DNS]::GetHostByAddress()(现在是 [System.Net.DNS]::GetHostEntry())虽然名字中含有 DNS,但它并不仅依赖于 DNS。它还会检查本地的C:\Windows\System32\Drivers\etc\hosts文件以获取本地配置的条目。

直接使用nslookup通过 DNS 无法找到名称:

PS C:\Users\Tim> nslookup 192.168.1.50
Server:  dns03
Address:  192.168.2.103

*** rpi03 can't find 192.168.1.50: Non-existent domain

然而,gethostentry() 仍然能够找到该名称:

PS C:\Users\Tim> [system.net.dns]::gethostentry('192.168.1.50')

HostName  Aliases AddressList
--------  ------- -----------
localentry {}      {192.168.1.50}

我的返回结果显示主机未知,但计算机正在运行。 - Raul Chiarella

4

命令:

wmic.exe /node:10.20.30.40 OS get CSName /format:list 

整个子网的批处理文件:

for /L %%z in (1,1,254) do wmic.exe /node:10.20.30.%%z OS get CSName /format:list 2>NUL

这对一些IP地址起作用,但出于某种原因,另一些IP地址无法工作。相反,终端会给我一个"RPC服务器不可用"的消息。 - Raul Chiarella

0
你可以尝试使用以下命令: Invoke-Command -computername $computer {Get-Item HKLM:\SYSTEM\ControlSet001\Control\ComputerName\ActiveComputerName} 活动计算机名称等于你的 DNS 名称(当然不包括后缀)。

0

我可能误解了问题,但您可以使用CIM会话查询远程计算机上的Win32_ComputerSystem实例,并使用其中一个属性(名称、DNS名称等)。在本地运行时,它将类似于:

Get-CimInstance -namespace root/cimv2 -classname Win32_ComputerSystem | fl *

我知道WMI可能需要相当高的权限(例如域管理员),但是(a)这对于您的用例可能不是不可能的,(b)您可能可以使用较少的权限进行一些有限的查询。


1
我尝试使用Get-CimInstance命令,但如果通过IP地址使用它,则目标机器(在本例中为整个网络)需要在受信任的主机列表中。请参见下面的错误:Get-CimInstance:WinRM客户端无法处理请求。可以在以下条件下使用默认身份验证来使用IP地址:传输是HTTPS或目标位于TrustedHosts列表中,并提供明确的凭据。 - Mog
@Mog 你尝试在 CimSessionOption 上设置 -UseSSL,并指向 HTTPS 端口(默认为 5986)吗?错误信息似乎表明你可以这样做,而无需将计算机添加到受信任的主机列表中。 - Patrick87
此外,非默认身份验证方法是否适用于您的使用情况? - Patrick87

0
另一个想法可能是查询您的SCCM服务器(如果有):
(Get-WmiObject -Query "SELECT * from SMS_R_SYSTEM WHERE IPAddresses LIKE '%$ipaddress%'" -Namespace "root\sms\site_$SiteCode" -computerName $SCCMServer).Name

0

另一个使用PowerShell的想法:

Get-WmiObject -Class Win32_ComputerSystem -ComputerName $Computer -Property Name | ForEach-Object {$_.Name}

其中 $Computer 是一个 IP 地址


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