Winapi 如何使用批处理脚本调用Windows gethostbyaddr API

Winapi 如何使用批处理脚本调用Windows gethostbyaddr API,winapi,vbscript,dns,reverse-lookup,Winapi,Vbscript,Dns,Reverse Lookup,我已经用perl编写了一个小脚本来执行反向查找,但除非另一台机器也安装了perl,否则它是不可移植的。我想要一个脚本,它可以在同事的机器上无缝运行,也可以转换为自定义命令(通过更新PATH和PATHEXT环境变量)。脚本文件必须是可移植的,并且可供非管理员用户使用 批处理脚本似乎适合这个目的,但我不知道如何调用gethostbyaddr API。我想VBScript也是一个选项,并对其开放 这里有两个批处理脚本。希望至少有一个人能帮上忙 @ECHO OFF ::Lookup.bat ::http

我已经用perl编写了一个小脚本来执行反向查找,但除非另一台机器也安装了perl,否则它是不可移植的。我想要一个脚本,它可以在同事的机器上无缝运行,也可以转换为自定义命令(通过更新PATH和PATHEXT环境变量)。脚本文件必须是可移植的,并且可供非管理员用户使用

批处理脚本似乎适合这个目的,但我不知道如何调用gethostbyaddr API。我想VBScript也是一个选项,并对其开放


这里有两个批处理脚本。希望至少有一个人能帮上忙

@ECHO OFF
::Lookup.bat
::http://www.computing.net/answers/programming/ip-by-hostname/25313.html
::Takes input file of hostnames and creates csv file with hostnames and IP addresses.
::Gets IP's using nslookup
:: Output in file hostnames.csv in current folder

if "%1"=="" goto :Syntax

SET SCRIPTPATH=%~p0
CD %SCRIPTPATH%

del hostnames.csv

for /f %%e in (%1) do call :LOOKUP %%e
echo Done!!!
goto :EOF

:LOOKUP
SET HOST1=%1
FOR /F "skip=4 tokens=2 delims=:" %%A IN ('2^>NUL nslookup %1') DO ( ECHO %1,%%A>>%SCRIPTPATH%hostnames.csv )
GOTO :EOF

:Syntax
echo.
echo Syntax:
echo.
echo %0 ^<FileName^>
echo.
echo   where ^<FileName^> is a file containing a list of hostnames.
echo.
echo   The batch file will return the results to file hostnames.csv in current folder
goto :EOF
@ECHO关闭
::Lookup.bat
::http://www.computing.net/answers/programming/ip-by-hostname/25313.html
::获取主机名的输入文件,并创建带有主机名和IP地址的csv文件。
::使用nslookup获取IP
::在当前文件夹的文件hostnames.csv中输出
如果“%1”==“转到:语法
设置脚本路径=%~p0
CD%SCRIPTPATH%
del hostnames.csv
对于(%1)中的/f%%e,请调用:查找%%e
回声完成!!!
后藤:EOF
:查找
设置主机1=%1
对于/F“skip=4 tokens=2 delims=:”('2^>num nslookup%1')中的%%A执行(回显%1,%%A>>%SCRIPTPATH%hostnames.csv)
后藤:EOF
:语法
回响
回显语法:
回响
回显%0^
回响
echo,其中^是包含主机名列表的文件。
回响
回显批处理文件将结果返回到当前文件夹中的文件hostnames.csv
后藤:EOF

@echo关闭
::gethostname.bat
::获取IP地址的输入文件,并创建带有IP地址和主机名的csv文件。
::使用netBIOS获取主机名,这通常是准确的。如果没有来自的信息
::netBIOS,然后使用nslookup。屏幕输出中有大量调试语句。:)
::文件C:\TEMP\ip-resolved.csv中的输出
如果“%1”==“转到:语法
设置脚本路径=%~p0
CD%SCRIPTPATH%
回显ip、主机名、电源>C:\TEMP\ip-resolved.csv
对于(%1)中的/f%%e,请拨打电话:PING-NBT%%e
回声完成!!!
后藤:EOF
:PING-NBT
设置IP地址=%1
设置主机1=
回响
回显***ping%ipaddress%
设置为ON=0
PING-n 1%1 |查找/i“回复自”>nul&&SET ON=1
echo刚刚解析了ping回复。。。主机为%ON%
REM下一行跳过netBIOS检查主机是否脱机
如果“%ON%”==“0”转到:查找%ipaddress%%ON%
在主机%on%的情况下,继续回显到nbtstat
REM下一行检查netBIOS名称。
回波nbt1启动
对于('nbtstat-a%1^ | find'')中的/f%%i,请执行@set host1=%i
echo nbt=%host1%电源=%ON%
如果没有NetBIOS名称,则跳转到nslookup部分。
REM回显%2
如果“%host1%”==“转到:在%1上查找%1%
在%>>C:\TEMP\ip-resolved.csv上回显%ipaddress%,%host1%,%
回波nbt2端
后藤:EOF
:查找
echo nslookup1启动
对于('nslookup%1^ | find“Name:”)中的/f“tokens=2”%%i do@set host1=%%i
echo nslookup=%host1%power=%2
REM Next line=如果主机变量
rem如果不是“%host1%”,则=转到“%1”:EOF
回显%ipaddress%,%host1%,%2>>C:\TEMP\ip-resolved.csv
设置主机1=
回音nslookup2结束
后藤:EOF
:语法
回响
回显语法:
回响
回显%0^
回响
echo,其中^是一个文件,包含要访问的IP地址列表
回显我们需要的主机名。
回响
echo批处理文件将通过文件返回结果
echo C:\TEMP\ip-resolved.csv
后藤:EOF

您不能单独从VBScript调用API,如果您想要一个批处理文件,那么调用nslookupnslookup如何?对于NETBIOS反向查找,NSLookup不是很有用。在拥有数千个客户端的大型LAN环境中,我们需要NETBIOS反向查找
NBTSTAT-A
很有用,但我不确定这两个结果是否相似。也许它还在内部使用gethostbyaddr API(或者可能是另一种方式)。运行perl脚本进行反向查找总是能得到最好的结果,如果NETBIOS查找失败,NBTSTAT输出过于混乱,无法替代反向DNS。
@echo off
::gethostname.bat
::Takes input file of IP addresses and creates csv file with IP address and hostnames.
::Gets hostnames using netBIOS, which is usually accurate. If no info avail from
::netBIOS, then use nslookup. Plenty of debug statements in screen output. :)
:: Output in file C:\TEMP\ip-resolved.csv

if "%1"=="" goto :Syntax

SET SCRIPTPATH=%~p0
CD %SCRIPTPATH%

echo ip,hostname,power>C:\TEMP\ip-resolved.csv
for /f %%e in (%1) do call :PING-NBT %%e
echo Done!!!
goto :EOF

:PING-NBT
set ipaddress=%1
set host1=
echo.
echo ***Pinging %ipaddress%
SET ON=0
PING -n 1 %1 | find /i "Reply from" >nul && SET ON=1
echo Just parsed ping reply... host is %ON%
REM Next line skips netBIOS check if host is offline
IF "%ON%"=="0" GOTO :LOOKUP %ipaddress% %ON%
echo Proceeding to nbtstat with host %on%

REM The next lines check netBIOS name.
echo nbt1-start
for /f %%i in ('nbtstat -a %1^|find "<20>"') do @set host1=%%i
echo nbt=%host1% power=%ON%
REM If there isn't a NetBIOS name, then skips to nslookup section.
REM echo %2
if "%host1%"=="" goto :LOOKUP %1 %ON%
ECHO %ipaddress%,%host1%,%ON% >> C:\TEMP\ip-resolved.csv
echo nbt2-end
goto :EOF

:LOOKUP
echo nslookup1-start
for /f "tokens=2" %%i in ('nslookup %1^|find "Name:"') do @set host1=%%i
echo nslookup=%host1% power=%2
REM Next line=if host var 
rem if not "%host1%"=="%1" goto :EOF
ECHO %ipaddress%,%host1%,%2 >>C:\TEMP\ip-resolved.csv
set host1=
echo nslookup2-end
goto :EOF

:Syntax
echo.
echo Syntax:
echo.
echo %0 ^<FileName^>
echo.
echo   where ^<FileName^> is a file containing a list of IP addresses to
echo         which we need the hostname.
echo.
echo   The batch file will return the results via a file
echo   C:\TEMP\ip-resolved.csv
goto :EOF