我的网段是192.168.0.*
,目标网段是192.168.1.*
,可以ping通。
我想在我的程序(C# 或 VC)中获取目标(例如 192.168.1.132)的 MAC 地址。
我知道我可以使用 nmap 在 Linux 中扫描网络,但是如何在 Windows 中执行此操作?子网掩码是 255.255.255.0。
编辑: 也许 nmap 也无法获取不同子网的 mac 地址。
答案1
告诉我们网络地址而不告诉我们子网掩码,就像告诉我们您的门牌号是 12345 但不告诉我们街道名称一样。我假设子网掩码是 255.255.255.0。
如果目标计算机位于不同的网络中,则无法直接获取其 MAC 地址,原因如下:
A. 本地机器不会为远程机器进行 ARP。
B. 本地路由器不会为远程机器进行 ARP。
C. 远程路由器将为远程机器发送 ARP。远程机器将响应 ARP 查询,并将响应发送给查询器(即远程路由器),响应将在此处停止。
如果您需要查找远程机器的 MAC 地址,则需要访问远程路由器上的 ARP 缓存。
答案2
有适用于 Windows 的 nmap,您可以从 namp 网站下载。只需查找 Windows 版本,它甚至带有 GUI。
对于 C#,你可以使用发送ARP()。
答案3
对于同一子网:
arp
将显示您的计算机的 arp 表,其中将包括与其通信的客户端的 MAC 地址。因此,ping
然后arp
确保您从所需的客户端获取 MAC 地址。
(用于arp /?
命令上的帮助/用法显示)
对于不同的子网:
getmac /s [ip]
(使用 RPC,因此最好是 Windows 并且需要目标计算机上的权限,因此实际上仅在企业环境中有用。)
编辑 :(仔细想想,nbtstat
在 Windows 中您也可以尝试该命令。根据网络设置和配置,它可能有效也可能无效,但它肯定可以从不同的子网中提取 MAC 地址。)
答案4
假设您知道目标是 Windows 系统,我会使用 WMI(Windows CIM 实现)来实现此目的。 这里是针对 VB.Net 回答的同一个问题,它很容易转换为 VC 或 C#。正如链接所说,一定要导入System.Management
和System.Management.Instrumentation
命名空间。
Dim theManagementScope as new ManagementScope("\\" & ComputerName & "\root\cimv2")
Dim theQueryString as new string = "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 1"
Dim theObjectQuery as new ObjectQuery(theQueryString)
Dim theSearcher as new ManagementObjectSearcher(theManagementScope, theObjectQuery)
Dim theResultsCollection as ManagementObjectCollection = theSearcher.Get()
for each currentResult as ManagementObject in theResultsCollection
MessageBox.Show(currentResult("MacAddress").ToString())
next
也有可能获得来自 DHCP 服务器的信息使用 DhcpEnumSubnetClients、DhcpEnumSubnetClientsV4 或 DhcpEnumSubnetClientsV5。但不确定运行该程序需要何种权限,或者是否必须从 DHCP 服务器运行。 文档不是很清楚。