tuxhunt3r
Goto Top

Per Batch ermitteln, welche IPs in deinem Subnetz erreichbar sind

Alle erreichbaren IPs in einem Class-C-Subnetz auflisten

Guten Tag

Wenn man mal wissen will, welche IP-Adressen in einem gewissen Subnetz erreichbar sind, kann man sich dieses Batches bedienen.
Einziger Nachteil: Der Batch ist langsam. Er braucht ungefähr 5 Minuten, bis er durchgelaufen ist.

Hier der Code meines Batches SUBNETWALK.BAT (korrigierte Version):


::*
::* Subnetwalk.bat 
::* ============== 
::* Pingt alle IP-Adressen eines C-Netzes 
::* und listet alle pingbaren Geräte auf 
::*

@echo off
cls

::###################################################################
::Start-Aufgaben

::-------------------------------------------------------------------
::Parameter-Abfragen

if "%1%"=="" goto Manual  

if "%1%"=="?" goto Manual  

if "%1%"=="/?" goto Manual  

if "%1%"=="-?" goto Manual  

if "%1%"=="-h" goto Manual  

if "%1%"=="--h" goto Manual  

if "%1%"=="-help" goto Manual  

if "%1%"=="--help" goto Manual  

if "%1%"=="help" goto Manual  


::-------------------------------------------------------------------
::-------------------------------------------------------------------
::Wenn ein Ordner %systemroot%\temp\SubnetWalk existiert, wird dieser gelöscht
if exist %systemroot%\temp\SubnetWalk (
rmdir /s /q %systemroot%\temp\SubnetWalk
)

::-------------------------------------------------------------------

::-------------------------------------------------------------------
:: Erstelle Ordner für Logfiles
mkdir %systemroot%\temp\SubnetWalk
::Erstelle ein Logfile in diesem Ordner
echo Dieser Ordner wurde vom Batch SubnetWalk.bat erstellt >>%systemroot%\temp\SubnetWalk\SubnetWalk-Readme.txt
echo Dieser Ordner kann gelöscht werden. >>%systemroot%\temp\SubnetWalk\SubnetWalk-Readme.txt
::-------------------------------------------------------------------
::###################################################################

::###################################################################
::Hauptroutine

echo SUBNETWALK.BAT
echo ============= 
echo.
echo Das Subnet %1.0 wird durchsucht...
echo Achtung: Dieser Vorgang dauert mehrere Minuten!
echo Schiesst also nicht schon nach 10 Sekunden den Batch ab!
echo.
::-------------------------------------------------------------------
:Schleife
for /l %%a IN (1,1,255) DO call :Pingvorgang %1 %%a
goto Filterung

::-------------------------------------------------------------------

::-------------------------------------------------------------------
:Pingvorgang
ping -n 1 %1.%2 >>%systemroot%\temp\SubnetWalk\SubnetWalk-Log1.txt
if "%2"=="26" (  
echo Subnet %1.0 zu 10 Prozent durchsucht...
)

if "%2"=="52" (  
echo Subnet %1.0 zu 20 Prozent durchsucht...
)

if "%2"=="77" (  
echo Subnet %1.0 zu 30 Prozent durchsucht...
)

if "%2"=="103" (  
echo Subnet %1.0 zu 40 Prozent durchsucht...
)

if "%2"=="128" (  
echo Subnet %1.0 zu 50 Prozent durchsucht...
)

if "%2"=="154" (  
echo Subnet %1.0 zu 60 Prozent durchsucht...
)

if "%2"=="180" (  
echo Subnet %1.0 zu 70 Prozent durchsucht...
)

if "%2"=="205" (  
echo Subnet %1.0 zu 80 Prozent durchsucht...
)

if "%2"=="231" (  
echo Subnet %1.0 zu 90 Prozent durchsucht...
)

goto end
::-------------------------------------------------------------------

::-------------------------------------------------------------------
:Filterung
echo.
echo Subnetz wurde durchsucht. Filtere Ergebnisse...
echo.
type %systemroot%\temp\SubnetWalk\SubnetWalk-Log1.txt | find /i "ttl" >>%systemroot%\temp\SubnetWalk\SubnetWalk-Log2.txt  

::Putze überflüssige Zeichen aus jeder Zeile aus
@for /F "tokens=1,2,3,4 delims=: " %%a in (%systemroot%\temp\SubnetWalk\SubnetWalk-Log2.txt) do echo %%c >>%systemroot%\temp\SubnetWalk\SubnetWalk-Log3.txt  
echo Ergebnisse gefiltert!
echo.
echo Folgende IPs im Subnetz %1 sind pingbar:
echo.
type %systemroot%\temp\SubnetWalk\SubnetWalk-Log3.txt
echo.
goto end
::###################################################################

:Manual
echo SUBNETWALK.BAT
echo ============= 
echo.
echo Listet die pingbaren Geräte im angegebenen Subnetz auf. 
echo Dieser Batch funktioniert nur bei Subnetzen mit einer 24-bittigen Subnetzmaske,
echo d.h. bei C-Class-Netzen (255.255.255.0)!
echo.
echo.
echo Starte Batch folgendermassen:
echo %~n0 Netz-ID
echo.
echo Beispiel:
echo %~n0 192.168.0
echo.
echo.
echo Anmerkung:
echo Eine IP-Adresse besteht immer aus Netz-ID (welche u.a. das Subnetz definiert)
echo und einer Host-ID (welche den entsprechenden Client definiert).
echo Bei einem C-Class-Netz (d.h. einem Netz mit der Subnetzmaske 255.255.255.0)
echo besteht die Netz-ID immer aus den ersten drei Bytes.
echo.
echo Beispiel:
echo Die Netz-ID der IP-Adresse 192.168.0.101 ist in einem C-Netz (d.h. mit der
echo Subnetzmaske 255.255.255.0) 192.168.0
echo.

:end

Content-Key: 64751

Url: https://administrator.de/contentid/64751

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: miniversum
miniversum 26.07.2007 um 14:15:26 Uhr
Goto Top
Ein paar kleinere Verbesserungsvorschläge von mir:
Bei der Parameter-Abrafge würd ich
If /i "%1%"==
schreiben. dan würde z.B. auch
Subnetwalk HelP
in der Eingabeaufforderung gehen.

In der For-Schleife kanns man die 0 glaub ich weglassen... Also statt:
for /l %%a IN (0,1,255) DO call :Pingvorgang %1 %%a
lieber:
for /l %%a IN (1,1,255) DO call :Pingvorgang %1 %%a

Wenn du beim ping noch ein -w 1 mitgibst gehts noch shcneller (das 1 kansn tdu bei größeren bzw. langsamen netzen auch höher setzen wenn Du meinst):
ping -n 1 -w 1 %1.%2 >>%systemroot%\temp\SubnetWalk\SubnetWalk-Log1.txt

Und als vierter Punkt würde ich in der Hilfe den Beispielbefehlsaufruf nicht mit nem Festen Dateinamen machen sondern den Der Batch benutzen. So kann man di eBatch auch anders nennen und der Aufruf steht dennoch immer richtig in der Hilfe:
Statt
echo SubnetWalk 192.168.0
also
echo %~n0 192.168.0


miniversum
Mitglied: Seltermann
Seltermann 08.08.2007 um 17:01:52 Uhr
Goto Top
Bei der Ausführung deines Skripts kommt die Meldung: "if" ist syntaktisch an dieser Stelle nicht verarbeitbar.

Hier ist eine kleinere funktionierende Variante:

@ECHO off

cls

SET ip=192.168.0.
SET log=ips.txt

IF EXIST %log% DEL %log% && ECHO Datei wurde gelöscht
IF EXIST %log% NEQ 0 ECHO Datei konnte nicht gelöscht werden! & GOTO :eof

FOR /L %%i IN (0,1,255) DO (
 	ping -n 1 -w 5 %ip%%%i|find "TTL=" && ECHO %ip%%%i >> %log% || echo %ip%%%i nicht erreichbar  
)
Mitglied: TuXHunt3R
TuXHunt3R 09.08.2007 um 21:28:17 Uhr
Goto Top
Da hat mir Copy-Paste einen Streich gespielt.

Nun läuft es
Mitglied: Seltermann
Seltermann 10.08.2007 um 11:35:31 Uhr
Goto Top
Es kommt immer noch die gleiche Fehlermeldung!
Mitglied: TuXHunt3R
TuXHunt3R 10.08.2007 um 12:58:08 Uhr
Goto Top
Es zerreisst immer die Formatierung, wenn ich die korrigierte Version speichern will.
Werde mich an den Support wenden.....
Mitglied: Seltermann
Seltermann 10.08.2007 um 14:45:54 Uhr
Goto Top
Du musst den Batch-Code mit
####green|[Batch-Code]####red|
einklammern.
Mitglied: TuXHunt3R
TuXHunt3R 11.08.2007 um 16:41:35 Uhr
Goto Top
Der -Block hat einen Bock drin. Alle grösseren Code-Blöcke werden gar nicht angezeigt.
[Webmaster 12.08.2007: Codeblock geht wieder]

[TuXHunT3R 14.08.2007: Hallelujah!!!]
Mitglied: Seltermann
Seltermann 11.08.2007 um 22:04:35 Uhr
Goto Top
Oben steht bei dir <nocode> und unten

Das muss aber
####green|[hier steht der Batch-Code]####red|
heißen.
Mitglied: miniversum
miniversum 12.08.2007 um 10:12:55 Uhr
Goto Top
Das mit dem <nocode> stimmt schon...


miniversum
Mitglied: Sys3D
Sys3D 08.02.2008 um 10:50:51 Uhr
Goto Top
Hi!
Also wenn ich das file starte, blinkt es nur einmal kurz auf und das wars.... ?¿

Warum denn das? OS: WinXP Home SP2
Mitglied: TuXHunt3R
TuXHunt3R 08.02.2008 um 17:55:10 Uhr
Goto Top
@ Symanic

Starte das Teil mal aus der Kommandozeile direkt und poste die Fehlermeldung.
Mitglied: TuXHunt3R
TuXHunt3R 28.07.2008 um 17:55:47 Uhr
Goto Top
Da ich Ferien habe und darum etwas Zeit, habe ich das Ding mal in PowerShell umgeschrieben. Hier ist der Code:

# *******************************************
# * SubnetWalk.ps1                          *
# * ==============                          *
# * Pingt alle IP-Adressen eines C-Netzes   *
# * und listet alle pingbaren Geräte auf    *
# * History:                                *
# * TuXHunT3R - 11.06.2007 - New Batch      *
# * TuXHunT3R - 28.07.2008 - Recoded in PSL *
# *******************************************

###############################################################################
# Funktionen:
# ===========

function fcnTitel {
	Write-Host " "  
	Write-Host "________      ______             ________       __      ___________  " -ForegroundColor cyan  
	write-host "__  ___/___  ____  /_______________  /__ |     / /_____ ___  /__  /__" -ForegroundColor cyan  
	Write-Host "_____ \_  / / /_  __ \_  __ \  _ \  __/_ | /| / /_  __ `/_  /__  //__/" -ForegroundColor cyan  
	Write-Host "____/ // /_/ /_  /_/ /  / / /  __/ /_ __ |/ |/ / / /_/ /_  / _  ,<   " -ForegroundColor cyan  
	Write-Host "/____/ \__,_/ /_.___//_/ /_/\___/\__/ ____/|__/  \__,_/ /_/  /_/|_|  " -ForegroundColor cyan  
	Write-Host " "  
	Write-Host "Coded 2007 as Windows Batch, "  
	Write-Host "recoded in PowerShell Scripting Language @ the 28.07.2008"  
	Write-Host "-------------------------------------------------------------------------" -ForegroundColor cyan  
	Write-Host " "  
	write-host " "  
}

function fcnFusszeile {
	Write-Host " "  
	Write-Host " "  
	Write-Host "-------------------------------------------------------------------------" -ForegroundColor cyan  
	Write-Host "by TuXHunT3R"  
	Write-Host " "  
}

function fcnManual {
	fcnTitel
	write-host "Listet die pingbaren Geräte im angegebenen Subnetz auf. "  
	write-host "Dieses Script funktioniert nur bei Subnetzen mit einer 24-bittigen Subnetzmaske,"  
	write-host "d.h. bei C-Class-Netzen (255.255.255.0)!"  
	Write-Host " "  
	Write-Host " "  
	write-host "Starte Batch folgendermassen:"  
	write-host "SubnetWalk NetzID"  
	Write-Host " "  
	write-host "Beispiel:"  
	write-host "SubnetWalk 192.168.0"  
	Write-Host " "  
	Write-Host " "  
	write-host "Anmerkung:"  
	write-host "Eine IP-Adresse besteht immer aus Netz-ID (welche u.a. das Subnetz definiert)"  
	write-host "und einer Host-ID (welche den entsprechenden Client definiert)."  
	write-host "Bei einem C-Class-Netz (d.h. einem Netz mit der Subnetzmaske 255.255.255.0)"  
	write-host "besteht die Netz-ID immer aus den ersten drei Bytes."  
	Write-Host " "  
	write-host "Beispiel:"  
	write-host "Die Netz-ID der IP-Adresse 192.168.0.101 ist in einem C-Netz (d.h. mit der"  
	write-host "Subnetzmaske 255.255.255.0) 192.168.0"  
	fcnFusszeile
}
#
#
###############################################################################

Clear-Host

$NetzID = $Args

switch ($NetzID) {
	"" {fcnManual}  
	"?" {fcnManual}  
	"/?" {fcnManual}  
	"-?" {fcnManual}  
	"-h" {fcnManual}  
	"--h" {fcnManual}  
	"-help" {fcnManual}  
	"--help" {fcnManual}  
	"help" {fcnManual}  
	default{
		Write-Host " "  
		Write-Host " "  
		Write-Host " "  
		Write-Host " "  
		Write-Host " "  
		Write-Host " "  
		Write-Host " "  
		fcnTitel
		Remove-Item $env:temp\SubnetWalk.log -force | Out-Null
		$Gestartet = Get-Date -Format G
		for ($zaehler=1; $zaehler -lt 255; $zaehler++) {
			$address= $NetzID + "." + $zaehler  
			$ping = get-wmiobject win32_pingstatus -filter "Address='$address'"  
			if ($ping.statuscode -eq "0") {  
				$ping.ProtocolAddress | Out-File -FilePath $env:temp\SubnetWalk.log -Encoding default -Append
			}
			$PercentComplete = (100/254)*$zaehler
			Write-Progress -activity "Scan des Subnetz $NetzID.XXX" -Status "$zaehler/254" -PercentComplete $PercentComplete  
		}
		$Beendet = Get-Date -Format G
		Write-Host "Pingbare IP-Adressen im Subnetz $NetzID.XXX"  
		Write-Host "=============================================="  
		Write-Host "Gestartet: $Gestartet"  
		write-host "Beendet:   $Beendet"  
		Write-Host " "  
		Get-Content $env:temp\SubnetWalk.log
		#Remove-Item $env:temp\SubnetWalk.log -force
		fcnFusszeile
	}
}

Der Vorteil dieser Version: Es läuft etwas schneller als die Batch-Version und hat eine schicke Fortschrittsanzeige face-smile. Try and have Fun....