使用powershell在家庭网络上获取设备名称及其ipaddress

时间:2017-01-21 22:53:44

标签: powershell

这个问题源于尝试管理我的家庭wifi网络。我一直在玩弄get-netipaddress,ipconfig和nslookup.exe等命令。

以下命令引导我到某个地方,但它没有我正在寻找的信息。

Get-NetIPAddress | Format-Table

我希望能够获得家庭网络上所有设备的列表。包括设备IP地址,以及该设备的某种名称。上一个命令给出了一个ipaddress,但它看起来更像是一个mac地址?任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:8)

我将我的批处理工具转换为Powershell脚本 它是cmd行工具ping.exe,arp.exe和nslookup.exe的包装器。

  • 为了获得良好的效果,应打开并连接所有设备。
  • 要将所有可能的DeviceIP放入计算机的arp缓存中,
    预先执行对假定/ 24子网中的所有IP的ping操作。
  • Arp.exe -a将返回IP和MAC。
  • Nslookup.exe用于查找从任何本地域后缀中删除的名称。

编辑var $ SubNet以适合您的环境。

## Q:\Test\2017\01\21\SO_41785413.ps1
$FileOut = ".\Computers.csv"
## Ping subnet
$Subnet = "192.168.xyz."
1..254|ForEach-Object{
    Start-Process -WindowStyle Hidden ping.exe -Argumentlist "-n 1 -l 0 -f -i 2 -w 1 -4 $SubNet$_"
}
$Computers =(arp.exe -a | Select-String "$SubNet.*dynam") -replace ' +',','|
  ConvertFrom-Csv -Header Computername,IPv4,MAC,x,Vendor|
                   Select Computername,IPv4,MAC

ForEach ($Computer in $Computers){
  nslookup $Computer.IPv4|Select-String -Pattern "^Name:\s+([^\.]+).*$"|
    ForEach-Object{
      $Computer.Computername = $_.Matches.Groups[1].Value
    }
}
$Computers
$Computers | Export-Csv $FileOut -NotypeInformation
#$Computers | Out-Gridview

示例输出

Computername     IPv4            MAC              
------------     ----            ---              
Zyxel-24G-Switch 192.168.xyz.1   fc-f5-28-fc-f5-28
TMDat1-Plex      192.168.xyz.60  02-7c-2c-02-7c-2c
HPn54L           192.168.xyz.91  c8-cb-b8-c8-cb-b8
Medion-Tablett   192.168.xyz.114 08-d8-33-08-d8-33
dLAN-LiveCam     192.168.xyz.115 bc-f2-af-bc-f2-af
McMini           192.168.xyz.128 40-6c-8f-40-6c-8f
HPojPro8500plus  192.168.xyz.144 d4-85-64-d4-85-64
Amazon-Kindle2   192.168.xyz.152 10-ae-60-10-ae-60
SG-S4-active     192.168.xyz.162 40-0e-85-40-0e-85
TMDat1           192.168.xyz.167 28-92-4a-28-92-4a
HP-G1610         192.168.xyz.176 10-60-4b-10-60-4b
NetStream4Sat    192.168.xyz.191 00-0c-6c-00-0c-6c
Netio230b        192.168.xyz.230 24-a4-2c-24-a4-2c
fritz            192.168.xyz.250 bc-05-43-bc-05-43
HomeMatic-CCU    192.168.xyz.254 00-1a-22-00-1a-22

我自己的扩展版本附加了从Mac的前6个十六进制数字中提取的供应商,但要求从非常慢的Oui.txt下载 " http://standards-oui.ieee.org/oui.txt"

答案 1 :(得分:2)

我一直使用NETSTAT来弄清楚应用程序在做什么。

从正常的cmd提示符开始:

netstat -b

将返回所有连接以及与之关联的应用。

以下是netstat返回的示例:

 TCP    127.0.0.1:50452        iqbrix-pc:15485        ESTABLISHED
 [Everything.exe]
  TCP    192.168.4.210:27036    ZOE-SURFACE:55915      ESTABLISHED
 [Steam.exe]
  TCP    192.168.4.210:49674    server18101:5938       ESTABLISHED
 [TeamViewer_Service.exe]
  TCP    192.168.4.210:49798    msnbot-65-52-108-183:https  ESTABLISHED
  WpnService
 [svchost.exe]
  TCP    192.168.4.210:49829    pf-in-f109:imaps       ESTABLISHED
  OneSyncSvc_320294
 [svchost.exe]

您可以解析返回的数据并从那里移动。

答案 2 :(得分:1)

可以用“Resolve-DnsName”找到dns,用“Get-NetNeighbor”(arp表缓存)找到mac/ips。可以扫描 ips 并使用“测试连接”(ping)。 “测试连接”还可以让您查找打开的 tcp 端口,因此如果端口 80 已打开,您可以在浏览器中转到该地址,或者如果端口 135 已打开,则可以转到该文件共享地址。最后,如果仍然无法识别设备,可以使用站点查找arp 给出的mac 地址或使用底部的代码。

使用arp表缓存查找设备

需要 powershell 7 或更高版本:

#replace the string with e.g. "192.168.1.$_", whatever your subnet is, optional but will improve # of devices found
$ips= 0..255 | %{"10.0.0.$_"};

#optional: add ports to scan. 22=ssh, 80=http, 443=https, 135=smb, 3389=rdp
$ports= 22, 80, 443, 135, 3389;

#optional: change batch size to speed up / slow down (warning: too high will throw errors)
$batchSize=64;

$ips += Get-NetNeighbor | %{$_.IPAddress}
$ips = $ips | sort | unique;
$ips | % -Throttlelimit $batchSize -Parallel {
    $ip=$_;
    $activePorts = $using:ports | %{ if(Test-Connection $ip -quiet -TcpPort $_ -TimeoutSeconds 1){ $_ } }
    if(Test-Connection $ip -quiet -TimeoutSeconds 1 -count 1){
        [array]$activePorts+="(ping)";
    } 
    if($activePorts){
        $dns=(Resolve-DnsName $ip -ErrorAction SilentlyContinue).NameHost;
        $mac=((Get-NetNeighbor |?{$_.State -ne "Incomplete" -and $_.State -ne "Unreachable" -and $_.IPAddress -match $ip}|%{$_}).LinkLayerAddress )
        return [pscustomobject]@{dns=$dns; ip=$ip; ports=$activePorts; mac=$mac}
    }
} | tee -variable "dvcResults"
$dvcResults | sort -property mac

注意:您无法确定 dns,因为可能未配置反向区域。 (所以dns字段可能不完美)

如果你想查找mac地址,你可以使用下面的代码附加这些数据或访问一个网站(注意:下面的代码从standards-oui.ieee.org/oui/oui.txt下载数据)< /p>

#build dict
$oui = (irm standards-oui.ieee.org/oui/oui.txt) -split '\r?\n';
$dict=@{};
$oui | ?{$_ -match "^[^\s]{8}"} | %{$arr=$_ -split "\s+";$dict[$arr[0]]=(($arr |select-object -skip 2) -join " ")}

#append data
$dvcDescriptions = $dvcResults | %{[pscustomobject]@{dns=$_.dns; ip=$_.ip; ports=$_.ports; companyName=$_.mac ? $dict[$_.mac.Substring(0,8)] : ""; mac=$_.mac;}};

$dvcDescriptions | sort -property companyName | Format-Table

例如。输出:

ex output

输出显示了托管 Windows 文件共享的 asus 计算机、托管 https 的戴尔服务器、带 ssh 的 raspberry pi、mac mini 和托管网络服务器的 hp 打印机。如果我进入我的路由器页面,我可以看到我们的解析 dnsname 无法找出的 raspberry pi 设备名称 (pizero1)。

答案 3 :(得分:0)

Get-NetIPAddress将显示IPv4和IPv6的IP地址。您可能会混淆MAC的IPv6地址。