VBScript:获取指定IP地址的MAC地址(仅限)

VBScript:获取指定IP地址的MAC地址(仅限),vbscript,Vbscript,我需要写一个小脚本,我可以用它来获取特定IP地址的MAC地址。所以,你可以用 arp -a 192.168.x.x | FIND "192.168.x.x" 但您的结果仍将类似于: Interface: 192.168.x.x --- 0x10 192.168.x.x 00-00-00-00-00-00 dynamic 不知何故,使用正则表达式或其他高级解析方法,我想将其缩减为echo“00-00-00-00-00-00”。我可以用下面的,但我想要更

我需要写一个小脚本,我可以用它来获取特定IP地址的MAC地址。所以,你可以用

arp -a 192.168.x.x | FIND "192.168.x.x"
但您的结果仍将类似于:

Interface: 192.168.x.x --- 0x10
   192.168.x.x             00-00-00-00-00-00     dynamic  
不知何故,使用正则表达式或其他高级解析方法,我想将其缩减为echo“00-00-00-00-00-00”。我可以用下面的,但我想要更干净的:

set obj_exec = obj_shell.Exec("%comspec% /C arp -a 192.168.x.x | FIND "192.168.x.x" > c:\temp\tmp_gatewayMAC.txt")
set obj_FSO = createobject("Scripting.FileSystemObject")
set obj_file = obj_FSO.opentextfile("c:\temp\tmp_gatewayMAC.txt", 1)
do until obj_file.AtEndOfStream
    str_line = obj_file.readline
    if instr(str_line, "dynamic") > 0 then
        str_MACaddress = str_line
    end if
loop

str_MACaddress = replace(str_MACaddress, "dynamic","")
str_MACaddress = replace(str_MACaddress, "192.168.x.x","")
str_MACaddress = replace(str_MACaddress, " ","")
str_MACaddress = trim(str_MACaddress)
vbscript.echo(str_MACaddress)
目前,忽略我们如何确定网关IP地址,因为我将为此提出一种与此不同的方法。理想情况下,我可以运行(但找不到)其他实用程序,比如ARP,但它只返回MAC

Option Explicit

Dim IP
    IP = "192.168.1.1"

Dim getMACCommand
    getMACCommand = """%comspec%"" /q /c ""for /f ""skip=3 tokens=2"" %a in ('arp -a "& IP &"') do echo %a"""

Dim strMACAddress    
    strMACAddress = WScript.CreateObject("WScript.Shell").Exec(getMACCommand).StdOut.ReadAll

    WScript.Echo strMACAddress

是的,它可以用regexp来完成,但是由于数据是从派生的
cmd
实例中检索的,所以让它比简单的解析器多花一点代码来完成这项工作,但是它使用WMI来查找具有特定IP地址的网络适配器的mac地址。由于它使用WMI,ip地址将存储在一个数组中,我们需要检查ip是否在该特定适配器的列表中

Option Explicit

Dim objWMIService, colItems, objItem
Dim strQuery, strIP, strMAC, strIPAddressToLocate

strIPAddressToLocate = "169.244.119.133"
strMAC = ""

strQuery = "SELECT * FROM Win32_NetworkAdapterConfiguration"
Set objWMIService = GetObject( "winmgmts://./root/CIMV2" )
Set colItems      = objWMIService.ExecQuery( strQuery, "WQL", 48 )

For Each objItem in colItems
    ' Ensure this adapter has at least one IP by checking if the value is an array. Filter out null/empty
    If IsArray( objItem.IPAddress ) Then
        If UBound( objItem.IPAddress ) = 0 Then
            ' Only one ip. Return that.
            strIP = objItem.IPAddress(0)
        Else
            ' Multiple IP's. Concat them so we can check contents with instr.
            strIP = Join( objItem.IPAddress, "," )
        End If

        If InStr(strIP,strIPAddressToLocate) <> 0 Then
            ' Get the mac address of the adapter matching this ip address. 
            strMAC = objItem.MacAddress
            ' Found the MAC we are looking for. Stop checking the loop
            Exit For
        End If
    End If
Next

If strMAC <> "" Then
    MsgBox "The IP Address: " & strIPAddressToLocate & " appears to be assigned to the adapter with the MAC Address: " & strMAC
Else
    MsgBox "Unable to locate a network adapater with the Ip Address: " & strIPAddressToLocate
End If
选项显式
Dim objWMIService、colItems、objItem
Dim strQuery、strIP、strMAC、strIPAddressToLocate
strIPAddressToLocate=“169.244.119.133”
strMAC=“”
strQuery=“从Win32\u网络适配器配置中选择*
设置objWMIService=GetObject(“winmgmts://./root/CIMV2" )
Set colItems=objWMIService.ExecQuery(strQuery,“WQL”,48)
对于每个对象,在colitem中
'通过检查值是否为数组,确保此适配器至少有一个IP。过滤掉空/空
如果是IsArray(objItem.IPAddress),则
如果UBound(objItem.IPAddress)=0,则
“只有一个ip。把那个还给我。
strIP=objItem.IPAddress(0)
其他的
'多个IP。把它们粘在一起,这样我们就可以用仪器检查内容了。
strIP=Join(objItem.IPAddress,“”)
如果结束
如果InStr(strIP,strIPAddressToLocate)为0,则
'获取与此ip地址匹配的适配器的mac地址。
strMAC=objItem.MacAddress
“找到了我们要找的MAC电脑。停止检查循环
退出
如果结束
如果结束
下一个
如果strMAC“”则
MsgBox“IP地址:&strIPAddressToLocate&”似乎分配给MAC地址为:&strMAC的适配器
其他的
MsgBox“无法找到Ip地址为:&strIPAddressToLocate的网络适配器”
如果结束

太棒了!非常感谢。不幸的是,我完全不知道命令本身是如何工作的(这部分:
for/f”“skip=3 tokens=2”“%a in
)@Beems,它的意思是:从输出中执行
arp
命令,跳过三行,其余的行使用空格作为分隔符(默认情况下)获取行中的第二个令牌并回显此令牌这对远程地址似乎不起作用。对此表示抱歉。我没想到你在找远程地址