format-c
Goto Top

IP-Adresse per Batch auslesen

Und ewig grüßt das Murmeltier...
Das alte Thema "Wie ermittle ich die IP-Adresse meines Rechners in einem Batchskript". Das Thema wurde hier schon mal behandelt und als "gelöst" gekennzeichnet. Allerdings bin ich mit der auf dem Befehl ipconfig beruhenden Lösung nicht so ganz zufrieden.

Denn ipconfig gibt immer Informationen über alle Netzwerkadapter aus. Hat man z.B. zusätzlich zum LAN-Adapter noch eine WLAN-Karte und/oder ein virtuelles Netzwerk (wie z.B. das Host-Only-Network von der Virtualbox) wird die Sache schnell unübersichtlich, mann muss zusätzliche Kontrollmechanismen (wie z.B. einen Zähler) einbauen usw. Sonst bekommt man immer die letztgenannte IP-Adresse, die nicht unbedingt die richtige sein muss. Und das Konzept mit dem Zähler ist auch noch davon abhängig, in welcher Reihenfolge die einzelnen Netzwerkadapter ausgegeben werden, was sich aber von Rechner zu Rechner unterscheiden kann.

Lange Rede, kurzer Sinn, here it is:

FOR /F "tokens=3,5" %a in ('netsh interface ipv4 show route') do @IF '%a'=='0' FOR /F "tokens=2" %A in ('netsh interface ipv4 show addresses %b ^| find "IP-Ad"') do @echo IP: %A  
Noch schneller geht es mit dieser Variante:
FOR /F "tokens=5" %a in ('netsh interface ipv4 show route ^| find "0.0.0.0/0"') do @FOR /F "tokens=2" %A in ('netsh interface ipv4 show addresses %a ^| find "IP-Ad"') do @echo IP: %A  

Ist zwar eine sehr lange, aber dennoch eine einzige Zeile. (Wer diese Zeile in einer Batchdatei verwenden möchte, sollte nicht vergessen alle Vokommen von %x zu %%x zu erweitern.)

Erklärung:
in der Ausgabe des Befehls netsh interface ipv4 show route steht an erster Stelle in der Spalte Idx der Index des richtigen Netzwerkadapters. Diesen greifen wir uns und bekommen dann mit netsh interface ipv4 show addresses <index> die IP-Konfi für den Netzwerkadapter mit der gegebenen Indexnummer. (Ohne die Angabe der Indexnummer ist die Ausgabe ähnlich wie bei ipconfig.) Jetzt also nur noch nach dem passenden String filtern und die echo-Ausgabe durch eine set-Anweisung geeignet ersetzen. Finito.

Ein alternativer Weg wäre es, die Indexnummer aus netsh interface ipv4 show interfaces herauszufiltern. Diese Methode hat sich allerdings als unzuverlässig entpuppt: ich habe Rechner gesehen, auf denen die Bezeichnung "LAN-Verbindung" dem bereits erwähnten virtuellen Netzwerk der Virtualbox gehörte, während die gesuchte Netzwerkkarte auf den Namen "Ethernet" gehört hat. Ist also wieder Rechner-abhängig. Da halte ich den Eintrag in der Routingtabelle, der die Metrik 0 hat, für zuverlässiger.


Noch einfacher geht es mit dem Tool "Swiss File Knife". Da bekommt man mit sfk.exe ip sofort das, wonach man sucht. Die Sache hat aber zwei kleine Haken: a) mehr als die IP-Adresse erfährt man dabei auch nicht (d.h. keine Subnetzmaske) und b) auch wenn das Tool Freeware ist, geht man dabei über Bordmittel hinaus (ist nur so eine Prinzip-Sache).


Wenn ihr bessere oder vergleichbare Lösungen habt, bitte teilt euer Wissen mit uns.


Schöne Grüße
Eugen

Content-ID: 203752

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

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

Endoro
Endoro 21.03.2013 um 20:44:12 Uhr
Goto Top
Hallo Eugen,
das klappt leider bei mir nicht (XP):
WARNUNG: Es konnten keine Hostinformation vom Computer: [ABCDEFGHIJK] ermittelt
werden. Einige Befehle sind eventuell nicht verfügbar.
Das angegebene Modul wurde nicht gefunden.

Der folgende Befehl wurde nicht gefunden: interface ip show route.

bb
format-c
format-c 22.03.2013 um 02:10:52 Uhr
Goto Top
Hast Recht. Sorry, ich habe nicht daran gedacht, das oben beschriebene auch auf einem XP-System zu testen. Die Net-Shell unter XP ist in der Tat weitaus weniger mächtig als die unter Win7 und dieses Skript funktioniert so ohne Weiteres nicht. Erstens, funktioniert ohne den "Routing- und RAS-Dienst" die Hälfte der Befehle schon mal gar nicht. Und dieser ist wiederum zunächst deaktiviert. Also müssen wir ein CMD-Fenster mit Admin-Rechnten anschmeißen und
sc config remoteaccess start= auto
net start remoteaccess
ausführen. Zweitens, dann müssen wir feststellen, dass im Kontext netsh interface ip show nichts mit "route" zu finden ist. Es gäbe zwar die Möglichkeit netsh routing ip show rtmroutes, aber dort gibt es keine Angaben zum Index, und selbst wenn es welche gäbe — in der Netshell von XP nützt einem der Index des Netzwerkadapters bei der Suche nach der IP-Adresse nichts.
Nicht verzweifeln! Irgendwie klappt es doch noch. Ein möglicher Workaround wäre z.B. sowas:
for /F "tokens=6*" %i in ('netsh routing ip show rtmroutes ^| find "0.0.0.0/0"') do @for /F "tokens=1" %a in ('netsh interface ip show ipaddress ^| find "%j"') do @echo IP: %a  
Man kann statt nach "0.0.0.0/0" zu filtern auch "255.255.255.255/32" nehmen. (Auch für dieses Codefragment gilt selbiges wie oben.)

Leider funktionieren die Befehle netsh routing ip show rtmroutes und netsh interface ip show ipaddress trotz des gestarteten Dienstes für "Routing- und RAS" nur mit Admin-Rechten.


Grüße
Eugen
format-c
format-c 22.03.2013 aktualisiert um 14:50:40 Uhr
Goto Top
Hier wird eine weitere Lösung beschrieben. Das Gute an der ist, dass sie gleich gut auf allen Windows Versionen funktioniert. Und wie der Autor des verlinkten Beitrags mag ich Einzeiler ebenfalls. face-smile

for /f "tokens=2 delims=" %a in ('ping -n 1 -4 %computername% ^| find /I "%computername%"') do @echo IP: %a  


Grüße
Endoro
Endoro 22.03.2013 um 15:06:40 Uhr
Goto Top
Hallo, das klappt super. Nur manchmal wird "127.0.0.1" ausgegeben, worum man sich noch kümmern muss.

Gruss!

bb
ThePinky777
ThePinky777 25.03.2013, aktualisiert am 27.03.2013 um 22:32:58 Uhr
Goto Top
Hier ein VBS Script zum auslesen aus der WMI:
'#############################################################  
' **************************************************  
' * IP-Adressen und MAC-Adressen auflisten  
' **************************************************  
'On Error Resume Next  

Set wmi = GetObject("winmgmts:")  
' alle Instanzen finden, bei denen IPEnabled auf true gesetzt ist  
wql = "select * from win32_NetworkAdapterConfiguration where IPEnabled=true"  
Set configs = wmi.ExecQuery(wql)

For each config in configs
Set assoc = config.Associators_(,"Win32_NetworkAdapter",,,,,,,32)  
	' die zugehörige Win32_NetworkAdapter-Klasse finden  
	For each karte in assoc
		Set adapter = karte
		' gibt nur eine, also Schleife verlassen  
		exit For
	Next	
		' Join macht aus einem Variablenfeld einen String  
		if instr(adapter.name, "Nortel") = 0 then  
		 	if config.DHCPEnabled = true then
		 		DHCP = "Ja"  
		 	else
		 		DHCP = "Nein"  
		 	end If
		 	
			WScript.Echo adapter.name 
			WScript.Echo adapter.MACAddress 
			WScript.Echo Join(config.IPAddress, ",")   
			WScript.Echo config.DHCPServer 
			WScript.Echo DHCP
			WScript.Echo config.DNSDomain
		end if
Next


'#############################################################  
Einfach in ein Text file kopieren und ipauslesen.vbs nennen. dann im dos per kommando:
cscript c:\ipauslesen.vbs
starten.
[Edit Biber] Codeformatierung. [/Edit]
format-c
format-c 26.03.2013 um 12:46:04 Uhr
Goto Top
Zitat von @ThePinky777:
...
if instr(adapter.name, "Nortel") = 0 then
...

Hallo ThePinky777.
Verstehe ich es richtig, dass "Nortel" hier der Name des Herstellers des Netzwerkadapters ist? Falls ja, dann müsste man für jeden Rechner, auf dem dieses Skript ausgeführt wird, zuerst erfahren, wie die Netzwerkkarte heißt, wozu wiederum eine menschliche Interaktion erforderlich wäre. Gibt es da nicht irgendeinen Weg, das Skript vollautomatisch arbeiten zu lassen?


Grüße
format-c
ThePinky777
ThePinky777 27.03.2013 aktualisiert um 21:30:00 Uhr
Goto Top
Zitat von @format-c:
> Zitat von @ThePinky777:
> ...
> if instr(adapter.name, "Nortel") = 0 then
> ...

Hallo ThePinky777.
Verstehe ich es richtig, dass "Nortel" hier der Name des Herstellers des Netzwerkadapters ist? Falls ja, dann
müsste man für jeden Rechner, auf dem dieses Skript ausgeführt wird, zuerst erfahren, wie die Netzwerkkarte
heißt, wozu wiederum eine menschliche Interaktion erforderlich wäre. Gibt es da nicht irgendeinen Weg, das Skript
vollautomatisch arbeiten zu lassen?


Grüße
format-c

ne die Zeile sagt er soll "Nortel" Ausschließen.
Nortel ist ein anbieter von VPN verbindungen/treiber, sieht in der WMI aus wie ne netzwerkkarte ist aber nur eine Virtuelle, ergo uninteressant.
gibt vielleicht noch 1-2 weitere hersteller die man so ausschließen könnte wenns stört, z.B. Cisco AnyConnect oder so heißt einer. Wobei ich keine Ahnung hab wie dort dann die Netzwerkkarte heißt.

Aber du könntest das Script ja einfach mal starten dann siehst dus schon, das es geht face-smile
Das script lief ei 9000 Rechnern fehlerfrei, ergo denk ich wirds auch bei dir laufen face-smile

Aber ich gebs zu ist komisch gescriptet, ich häts auch anders gemacht face-smile kollegen halt face-smile

und wenn man die Daten speichern will in ne Datei hier ne Anleitung:
http://pc-know-how.g-websys.de/themen/004_vbs_script__inhalte_in_eine_d ...
LinWinx86
LinWinx86 04.05.2013 um 00:00:14 Uhr
Goto Top
Abend,

ca. tausendmal getestet mit Win XP, funktioniert ohne Probleme face-wink

IPCONFIG | FINDSTR "IP-Adresse" >ip.tmp
FOR /F "tokens=2,3,4 delims=:. " %%a IN (ip.tmp) DO SET SubNet=%%a.%%b.%%c
DEL ip.tmp
ThePinky777
ThePinky777 13.05.2013 um 12:59:29 Uhr
Goto Top
Zitat von @LinWinx86:
Abend,

ca. tausendmal getestet mit Win XP, funktioniert ohne Probleme face-wink

> IPCONFIG | FINDSTR "IP-Adresse" >ip.tmp
> FOR /F "tokens=2,3,4 delims=:. " %%a IN (ip.tmp) DO SET SubNet=%%a.%%b.%%c
> DEL ip.tmp

jo funktioniert aber nur auf deutschem Betriebssystem, weil "IP-Adresse" als text gibts weder auf Englischem, Französischem, Spanischem und Schwedischen system, es reicht hierbei auch schon wenn ein anderer Language pack benutzt wird, das es nicht mehr geht.

daher kann man das script dann nur einsetzen wenn man das alles abfängt face-smile
wenn mans aus der WMI ausliest wie das VBS Script dann ist sprachversion wurst.
format-c
format-c 13.05.2013 um 16:34:27 Uhr
Goto Top
Hätte LinWinx86 den ersten Beitrag dieses Threads aufmerksam gelesen, dann hätte sich sein Beitrag ganz erübrigt.


Grüße
format-c
format-c
format-c 22.06.2013 um 14:32:15 Uhr
Goto Top
Hallo allerseits.

In meinem Beitrag über die Berechnung der Broadcast-Adresse habe ich eine andere Lösung präsentiert, die doch noch auf ipconfig basiert:

SETLOCAL EnableDelayedExpansion

REM # IP-Adresse holen
for /f "tokens=2 delims=" %%a in ('ping -n 1 -4 %COMPUTERNAME% ^| find /I "%COMPUTERNAME%"') do set ip_adresse=%%a

for /f "tokens=2 delims=:" %%A in ('ipconfig ^| findstr "%ip_adresse% Subnet"') do (
	REM # IP-Adresse bereinigen (Leerzeichen entfernen) und in einer 
	REM # temporären Variable speichern
	for /f %%a in ("%%A") do set gefunden=%%a
	REM # Die Subnetzmaske soll nur dann ausgelesen werden, wenn sie
	REM # unmittelbar auf die "richtige" IP-Adresse folgt,
	REM # ansonsten wird sie verworfen.
	IF '!gefunden!'=='%ip_adresse%' (
		set flag=1
	) ELSE (
		IF '!flag!'=='1' (
			set subnetz_ip=!gefunden!
			set flag=
		)
	)
)
set gefunden=
Mit einem Flag funktioniert auch die Erkennung der Subnetzmaske zuverlässig.


Grüße
format-c