我正在尝试编写一个脚本,该脚本取决于了解网络段上计算机的名称,但是我找到的所有脚本都依赖于 DNS 查询,它只会回复一些机器的名称。例如:
[System.Net.Dns]::GetHostbyAddress($IPAddress)
我也尝试过使用。
Ping -a $ipaddress
但是这样通常无法返回计算机名称。有没有一种方法可以直接询问主机它的名称以及在活动目录中需要什么级别的权限才能获得响应?
提前感谢。
我正在尝试编写一个脚本,该脚本取决于了解网络段上计算机的名称,但是我找到的所有脚本都依赖于 DNS 查询,它只会回复一些机器的名称。例如:
[System.Net.Dns]::GetHostbyAddress($IPAddress)
Ping -a $ipaddress
但是这样通常无法返回计算机名称。有没有一种方法可以直接询问主机它的名称以及在活动目录中需要什么级别的权限才能获得响应?
提前感谢。
[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}
命令:
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
我可能误解了问题,但您可以使用CIM会话查询远程计算机上的Win32_ComputerSystem
实例,并使用其中一个属性(名称、DNS名称等)。在本地运行时,它将类似于:
Get-CimInstance -namespace root/cimv2 -classname Win32_ComputerSystem | fl *
我知道WMI可能需要相当高的权限(例如域管理员),但是(a)这对于您的用例可能不是不可能的,(b)您可能可以使用较少的权限进行一些有限的查询。
CimSessionOption
上设置 -UseSSL
,并指向 HTTPS
端口(默认为 5986)吗?错误信息似乎表明你可以这样做,而无需将计算机添加到受信任的主机列表中。 - Patrick87(Get-WmiObject -Query "SELECT * from SMS_R_SYSTEM WHERE IPAddresses LIKE '%$ipaddress%'" -Namespace "root\sms\site_$SiteCode" -computerName $SCCMServer).Name
另一个使用PowerShell的想法:
Get-WmiObject -Class Win32_ComputerSystem -ComputerName $Computer -Property Name | ForEach-Object {$_.Name}
其中 $Computer 是一个 IP 地址
nbtstat
查看NetBios缓存,但实际上DNS是正确的技术工具。与其尝试寻找替代查询,解决DNS问题应该是第一优先事项。我会检查DHCP范围是否设置为动态更新DNS,并且它还会动态更新未请求更新的客户端。 - BenH