标题: [网络连接] 怎么通过批处理扫描局域网在线主机名、IP、MAC [打印本页]
作者: 爱美痞子 时间: 2022-4-7 12:29 标题: 怎么通过批处理扫描局域网在线主机名、IP、MAC
本帖最后由 爱美痞子 于 2022-4-7 12:41 编辑
请教各位
我手里现有一组代码,可以实现扫描局域网在线的主机名、IP和MAC,但是有的时候使用环境的局域网电脑没有安装computer browser服务,也不允许安装,所以就没有办法使用net view命令,返回值是列表为空,请问怎么能够通过不使用net view命令来实现扫描局域网内在线主机的主机名、IP和MAC,生成列表,列表不需要输出到文件,谢谢!- @echo off
- setlocal enabledelayedexpansion>nul
- echo.
- echo. 【 局域网在线主机列表 】
- echo. -------------------------------------------------------------
- echo. ^| 主机名 ^| IP地址 ^| MAC地址 ^|
- echo. -------------------------------------------------------------
- for /f "skip=3 delims=\ " %%a in ('net view') do (
- set "host= %%a "
- set ip=
- set mac=
- for /f "tokens=2 delims=[]" %%b in ('ping -4 %%a -n 1 ^|find /i "ping %%a"') do set "ip= %%b "
- for /f "tokens=4 delims= " %%c in ('nbtstat -a %%a ^|find /i "MAC 地址"') do set "mac= %%c "
- if not defined ip set "ip= "
- if not defined mac set "mac= ----- "
- echo. ^|!host:~-19!^|!ip:~-19!^|!mac:~-19!^|
- echo. -------------------------------------------------------------
- )
- echo.
- pause
复制代码
作者: cutebe 时间: 2022-4-8 11:52
好像写过http://bbs.bathome.net/redirect. ... 3669&ptid=62178
作者: 爱美痞子 时间: 2022-4-8 13:31
回复 2# cutebe
我之前就拜读过您的那个跟帖,不过您那组命令执行结束之后窗口就关闭了,没看到整理后的结果,我是非专业的,试了几次没整成。。。
作者: cutebe 时间: 2022-4-8 14:42
命令提示符中运行以下命令,看下结果- nbtstat -a %没有computer_browser服务的电脑IP%
复制代码
再把自动关闭的批处理拖命令提示符窗口中,回车运行,看下显示什么!
作者: 爱美痞子 时间: 2022-4-8 23:17
本帖最后由 爱美痞子 于 2022-4-10 21:24 编辑
命令提示符中运行以下命令,看下结果再把自动关闭的批处理拖命令提示符窗口中,回车运行,看下显示什么!
cutebe 发表于 2022-4-8 14:42
这个显示正常。
我整理了一下,目前的代码如下:- @echo off
- mode con cols=70 lines=39
- color e0
- echo.
- echo 扫描完1→255的整个网段大约需要3分钟的时间,请耐心等待......
- echo.
- echo 输入要扫描的IP段,直接回车则为此前输入的IP段(没输过则为192.168.1):
- set /p IpDuan=
- if "%IpDuan%"=="" (set IpDuan=192.168.1)
- echo 输入要扫描的IP起始位,直接回车则为此前输入的数值(没输过则为1):
- set /p QiShi=
- if "%QiShi%"=="" (set QiShi=1)
- echo 输入要扫描的IP结束位,直接回车则为此前输入的数值(没输过则为255):
- set /p JieShu=
- if "%JieShu%"=="" (set JieShu=255)
- cls
- echo.
- echo. 正在扫描[ %IpDuan%.%QiShi%-%IpDuan%.%JieShu% ]IP段内在线的主机。
- ::ping -n 1 -w 99 %ip%/ping -a
- ::nbtstat -a %ip%
- echo.
- echo. 【 局域网在线主机列表 】
- echo. ----------------------------------------------------------------
- echo. ^ IP地址 ^ 主机名 ^ MAC地址 ^
- echo. ----------------------------------------------------------------
- setlocal enableDelayedExpansion
- set "ip3=%IpDuan%"
- for /l %%i in (%QiShi%,1,%JieShu%)do (
- rem echo %%i
- call :CheckIPstatus %ip3%.%%i&&call :GetIPNameMAC %ip3%.%%i Name MAC
- if !errorlevel! equ 0 echo/ [%ip3%.%%i] [!Name!] [!MAC!]
- )
- echo. ------------------------ 扫描完成 ----------------------------
- echo.
-
- echo.
- pause |echo 按任意键退出。
- ::[完]
-
- ::ping是否通:返回码stat=失败/Lost
- :CheckIPstatus
- for /f "tokens=3 delims=,," %%p in ('"ping -n 1 -w 99 %1|findstr /i "数据包 Packets""')do (
- for /f "tokens=3" %%s in ("%%p")do set "stat=%%s"
- )
- exit/b %stat%
-
- ::nbtstat查ip对应计算机名、MAC
- :GetIPNameMAC IP Name MAC
- setlocal
- for /f "delims=" %%n in ('"nbtstat -a %1|findstr /ic:"唯一" /c:"UNIQUE" /c:"MAC ""')do (
- set "nbt=%%n"
- set "nbt=!nbt:<= !"
- set "nbt=!nbt:>=!"
- if "!nbt:唯一=!!nbt:UNIQUE=!" neq "!nbt!!nbt!" for /f %%m in ("!nbt!")do set "Name=%%m"
- if "!nbt:MAC=!" neq "!nbt!" for /f "tokens=4" %%m in ("!nbt!")do set "MAC=%%m"
- )
- if "%MAC%"=="" (set Bcode=1)else set Bcode=0
- endlocal&set %2=%Name%&set %3=%MAC%&exit/b %Bcode%
复制代码
有一个问题,因为nbtstat -a命令无法获取到本机的主机名和MAC,所以返回结果里本机对应的主机名和MAC是前一个IP的主机的,可否将这2个返回值定义成其他内容,比如“本机”,谢谢!
作者: 爱美痞子 时间: 2022-4-18 18:59
我目前整理的代码如下:- @echo off
- mode con cols=70 lines=39
- color e0
- set "NetIndex="
- for /f "tokens=1* delims==" %%a in ('wmic nic where "NetEnabled=TRUE and not Name like '%%Virtual%%'" get index /value^|find "="') do set NetIndex=%%b
- if defined NetIndex (
- echo.当前正在使用的网卡的Index值:%NetIndex%)>nul
- wmic nicconfig where index=%NetIndex% call SetTcpipNetbios 0 >nul
- cls
- setlocal enabledelayedexpansion>nul
- set "MACAddress="
- for /f "tokens=1* delims==" %%a in ('wmic nic where "NetEnabled=TRUE and not Name like '%%Virtual%%'" get MACAddress /value^|find "="') do set MACAddress=%%b
- if defined MACAddress (
- echo.网卡的MAC地址:%MACAddress%)>nul
- )
- set "MACAddress=%MACAddress: =%"
- echo.
- echo. 局域网在线主机扫描助手
- echo.
- echo 输入要扫描的IP段,直接回车则为此前输入的IP段(没输过则为192.168.1):
- set /p IpDuan=
- if "%IpDuan%"=="" (set IpDuan=192.168.1)
- echo 输入要扫描的IP起始位,直接回车则为此前输入的数值(没输过则为2):
- set /p QiShi=
- if "%QiShi%"=="" (set QiShi=2)
- echo 输入要扫描的IP结束位,直接回车则为此前输入的数值(没输过则为255):
- set /p JieShu=
- if "%JieShu%"=="" (set JieShu=255)
- cls
- echo.
- echo. 扫描完1→255的整个网段大约需要3分钟的时间,请耐心等待......
- echo.
- echo. 当前正在扫描[ %IpDuan%.%QiShi%-%IpDuan%.%JieShu% ]IP段内在线的主机。
- ::ping -n 1 -w 99 %ip%/ping -a
- ::nbtstat -a %ip%
- echo.
- echo. 【 局域网在线主机列表 】
- echo. ----------------------------------------------------------------
- echo. ^ IP地址 ^ MAC地址 ^ 主机名 ^
- echo. ----------------------------------------------------------------
- setlocal enableDelayedExpansion
- set "ip3=%IpDuan%"
- for /l %%i in (%QiShi%,1,%JieShu%)do (
- rem echo %%i
- call :CheckIPstatus %ip3%.%%i&&call :GetIPNameMAC %ip3%.%%i Name MAC
- if !errorlevel! equ 0 echo/ [ %ip3%.%%i ] [!mac:~-20! ] [!Name:~-20!]
- )
- echo. ------------------------ 扫描完成 ----------------------------
- echo.
- echo. * 其中MAC地址大写的行是本机信息。
- echo.
- pause |echo 按任意键退出。
- ::[完]
-
- ::ping是否通:返回码stat=失败/Lost
- :CheckIPstatus
- for /f "tokens=3 delims=,," %%p in ('"ping -n 1 -w 99 %1|findstr /i "数据包 Packets""')do (
- for /f "tokens=3" %%s in ("%%p")do set "stat=%%s"
- )
- exit/b %stat%
-
- ::nbtstat查ip对应计算机名、MAC
- :GetIPNameMAC IP Name MAC
- setlocal enabledelayedexpansion
- set name=其他非电脑设备
- set MAC= %MACAddress%
- for /f "tokens=3 delims= " %%m in ('ping -a -n 1 %1 ^|find /i "["') do set "name=%%m "
- echo.name:%name%>nul
- for /f "tokens=2 delims= " %%m in ('arp -a %1 ^|find /i "%1"') do set "MAC= %%m"
- echo.MAC:%MAC%>nul
- if "%MAC%"=="" (set Bcode=1)else set Bcode=0
- endlocal&set %2=%Name%&set %3=%MAC%&exit/b %Bcode%
复制代码
我是白丁,不懂写代码,代码中可能会存在一些无用的或者繁琐的代码,见笑了。
另外,因为扫描整个网段的时间比较长,哪位大神方便帮优化一下,或者加一个进度显示的提示,滚动条或者百分比都行,谢谢!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |