内网IP自动获取V2
redraiment, 2009-09-24
为解决上内网问题,我需要找一个 DHCP 未分配的 IP 地址来使用,在《内网IP自动获取》一文中的批处理能成功实现自动搜索。原理是逐个尝试地址是否可用,测试方法就是将本地地址设置成指定的静态 IP,然后去 ping 网关,直到找到一个成功的地址。但这种方法有些美中不足:
- 通过 netsh 设置本地静态 IP 比较耗时间;
- 如果 IP 已经被分配就会弹出一个消息框需要手工确认,因此并不算真正的自动化。
在前一篇评论里也有朋友在问,能 ping 通的主机就是在线主机,这样只要搜索不能 ping 通的 IP 地址即可。其实不然,大部分防火墙默认都开启了防 ping 规则,ping 都会被拦截,因此即使在线也 ping 不通。但转念一想:如果主机在线,它的物理地址机会记录在 ARP 列表里,在 ping 完一个地址后到 ARP 列表中检查是否存在该地址的记录,就可以确定这个地址是否已经被 DHCP 分配出去!用下面的代码去替换《内网IP自动获取》中的 scan 模块:
:scanarp -dfor /l %%d in (2,1,253) do (ping -n 1 %~n1.%%d & arp -a | find " %~n1.%%d "if ERRORLEVEL 1 (netsh int ip set address "本地连接" static %~n1.%%d 255.255.255.0 %1 1ping -w 10 -n 1 %1 | find /I "TTL"if NOT ERRORLEVEL 1 (netsh int ip set dns "本地连接" static 210.33.88.1 primaryexit)))
这段代码只在最终找到可用地址后才设置本地地址,执行效率比上一版本要高,但也有美中不足的地方:首先需是要清空 ARP 列表(arp -d),而清空列表操作需要有管理员权限才能执行。比如在 VISIA 系统中,需要右击批处理文件,选择“以管理员身份运行”。不过介于大部分人都是以 Administrator 的身份登入系统,所以不用太担心。呵呵。
评论
发表评论