批处理文件按名称对网络上的计算机组进行大规模 ping 操作,检查回复并解析主机名

批处理文件按名称对网络上的计算机组进行大规模 ping 操作,检查回复并解析主机名

因此,我的 Windows Active Directory 网络上有 5000 台计算机的列表,这些计算机可能仍然存在,也可能不存在(我知道,不用问...我需要知道一个项目,当然网络人员也帮不上什么忙,而且他们给我的数据有很多错误)

计算机名称介于 SAT1 到 SAT5000 之间。但是,其中一些可能已升级到新操作系统并重命名。因此在这种情况下,我也想检测新名称。

我想知道是否有人可能有这样的脚本,给定一个包含计算机名称列表的文本文件,对于每个计算机:1. ping 计算机以检查其是否存在(是的,我知道它必须处于打开状态)
2. 收到第一次 ping 得到的 ip 后,执行 ping -a 以获取主机名
3. 将结果写入文本文件

(甚至更好...是否有可能以某种方式将初始文件拆分成多个,并生成多个批处理文件以同时运行,以降低同步 ping 5000 台机器的速度缓慢?)

更新

这篇文章似乎与我所寻找的内容有些相关: http://www.enterpriseitplanet.com/networking/features/article.php/1571771

更新 2

这就是我最终得到的结果:

@echo off
rem del output.txt
rem Loop thru list of computer names in file specified on command-line

for /f %%i in (%1) do call :check_machine %%i
goto end

:check_machine

rem Check to see if machine is up.
echo %1
ping -n 2 %1 >NUL 2>NUL
if errorlevel 1 goto down

rem Reverse-lookup machine name and report
  for /f "usebackq tokens=2,3" %%d in (`ping -n 1 -a %1 ^| find "Pinging "`) do echo %1, %%d,%%e >> output.txt
goto end

:down
  rem Report machine down
  echo %1 >> output.txt

:end

输出格式如下:

SAT10 
SAT1209 
SAT601, CGY2601.na.sat.com,[110.3.111.70] 
SAT3592, CGY3592.na.sat.com,[110.0.237.45] 

如果将计算机列表拆分为多个较小的文件,则可以像这样异步 ping:

del output.txt
start MassPing.cmd Computers1.txt
start MassPing.cmd Computers2.txt
start MassPing.cmd Computers3.txt
start MassPing.cmd Computers4.txt
start MassPing.cmd Computers5.txt
start MassPing.cmd Computers6.txt

答案1

这是一个给您的批处理文件:

@echo off
rem Loop thru list of computer names specified on command-line
for /f %%i in (%1) do call :check_machine %%i
goto end

:check_machine

rem Check to see if machine is up.
ping -n 2 %1 >NUL 2>NUL
if errorlevel 1 goto down

rem Reverse-lookup machine name and report
for /f "usebackq tokens=2" %%d in (`ping -n 1 -a %1 ^| find "Pinging"`) do echo %1:Up:%%d
goto end

:down
rem Report machine down
echo %1:Down

:end

向它传递一个包含计算机名称列表的文本文件,它会对这些计算机执行 PING 操作(尝试 2 次 - 您可以通过增加第一个 PING 命令行上“-n”后面的数字来增加尝试次数),如果它收到响应,则对名称执行反向查找。它返回的结果如下:

computer-name-1:Up:name-it-resolved-to
computer-name-2:Down
computer-name-3:Up:name-it-resolved-to
...

要并行运行多个,只需创建多个包含不同机器名称列表的文本文件,然后并行启动几个副本。

快速而粗暴地挽救了局面。

答案2

您真的需要 ping 吗?计算机帐户将每 30 天自动更改一次密码。在 200/2003/2008 功能级别上,您可以使用dsquery computer -stalepwd X其中 X 是自上次更改密码以来的天数。此过程通常通过将响应此操作的计算机帐户移动到“旧”OU 来自动执行,然后在另外 30-90 天后,如果密码仍未更改,则会自动删除它们。

答案3

您还可以使用nmap扫描:

nmap -sn -PE -oG scan.txt 192.168.1.1 192.168.2.0/24

引用手册页:

-sn: Ping Scan - disable port scan
   The default host discovery done with -sn consists of an ICMP echo request,
   TCP SYN to port 443, TCP ACK to port 80, and an ICMP timestamp request
   by default.

-oN/-oX/-oS/-oG <file>: Output scan in normal, XML, s|<rIpt kIddi3,
   and Grepable format, respectively, to the given filename.

-PE; -PP; -PM (ICMP Ping Types) .
   In addition to the unusual TCP, UDP and SCTP host discovery types discussed
   previously, Nmap can send the standard packets sent by the ubiquitous ping
   program. Nmap sends an ICMP type 8 (echo request) packet to the target IP
   addresses, expecting a type 0 (echo reply) in return from available hosts.
   [...] Use the -PE option to enable this echo request behavior.

scan.txt看起来是这样的:

# Nmap 5.50 scan initiated Fri Aug 19 17:59:59 2011 as: nmap -vv -sn -PE -oG /tmp/scan.txt  192.168.1.1 192.168.2.0/24
# Ports scanned: TCP(0;) UDP(0;) SCTP(0;) PROTOCOLS(0;)

Host: 192.168.1.1 ()    Status: Down
Host: 192.168.2.0 (www.dummy.example.org)   Status: Up
Host: 192.168.2.1 (www.foo.example.org) Status: Down
...
# Nmap done at Fri Aug 19 18:03:26 2011 -- NNN IP addresses (1 host up) scanned in 4.02 seconds

答案4

我有类似的需求,需要对几千台计算机执行此操作,并开发了一个 PowerShell 脚本来处理此问题。此脚本同时运行多个后台作业以加快 ping 过程,并且可以选择执行 DnsLookup 来查找 IP 地址和完全合格域名。性能将根据遇到的超时次数而有所不同,但我已在短短 15 分钟内为 12,000 多台主机完成了此脚本。

脚本太大,无法在此处发布,但您可以在此处查看(和下载):

http://poshtips.com/2011/03/28/bgping-a-high-performance-bulk-ping-utility/

相关内容