ufo2012
Goto Top

Werte (IPs) aus Excel-Datei suchen, finden und in andere datei kopieren

Hallo,

ich muss in meinem Netzwerk alle Subnetzmasken ändern und hatte mir überlegt, da ich die IPs in einer Exceldatei habe, irgendwie eine Batchdatei zu erstellen, die diese Inhalte sucht und in eine Datei schreibt. ich hätte mit netsh interface ip set address name="LAN-Verbindung" source=static addr=192.168.52.42 mask=255.255.255.0 die Subnetzmasken der ca. 160 Pcs geändert. Also mit einem Skript könnte ich mir vielleicht viel Arbeit sparen. Danach hätte ich die neuen Skripte per GPO verteilt.
Ein weiteres problem ist, dass in der Exceldatei die PCs nach Gebäude sortiert sind und diese in den Tabellen wieder zu finden sind. (Eine Tabelle=ein Geäude).

Vielen Dank für Eure Hilfe jetzt schon einmal


mfg
heiko

Content-Key: 128426

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

Printed on: April 26, 2024 at 15:04 o'clock

Member: bastla
bastla Nov 02, 2009 at 10:15:46 (UTC)
Goto Top
Hallo ufo2012!

Deine Beschreibung ist ziemlich herbstlich (ich zumindest seh' nicht so richtig durch den Nebel) ...

Zumindest irgendeine Art von Struktur müsste doch in Deinen Exceldaten zu erkennen (und demnach auch zu beschreiben) sein.

Im Übrigen ist auch der geplante Ablauf der Aktion nicht nachvollziehbar: Wie/wo willst Du den Batch starten, wie soll die neue Maske aussehen (wenn nicht einheitlich: nach welchem Schema soll die Zuordnung erfolgen), ...

Grüße
bastla
Member: ufo2012
ufo2012 Nov 02, 2009 at 10:25:51 (UTC)
Goto Top
Sorry der Kaffee war heute schwach,

also nochmals von vorne.
Ich habe eine Exceldatei mit allen IPs der Pc. Diese ist aufgeteilt in Tabellen, die Gebäuden zugeordnet sind.
Jetzt kommt mein Problem: Wie kann ich ein Skript erstellen um diese Information abzugreifen und dann für jeden einzelnen PC eine eigene GPO erstellen zu können? Ich muss die Subnetzmaske aller PCs ändern.

Also kurz gesagt, ich bräuchte viele Batchdatei mit den IP Addressen der PCs aus der Exceltabelle, die ich dann manuell in GPOs packen kann.

Danke nochmals
Member: bastla
bastla Nov 02, 2009 at 10:37:34 (UTC)
Goto Top
Hallo ufo2012!

Wäre es nicht einfacher, per "StartUp"-Script jeden Rechner seine IP auslesen (Stichwort: "ipconfig" oder, besser, "WMI") und damit die Einstellung neu setzen zu lassen? Eine "Rückmeldung" könnte durch ein
echo %date%;%time%;%computername%;%ausgeleseneIP% >> \\Server\Share\ChangeSubnetMask.log
in eine Logdatei geschrieben werden (mit ";" als Trennzeichen ließe sich diese auch wieder in Excel importieren) ...

[Edit] Bessere Variante für das Auslesen:
netsh interface ip dump|findstr "mask"|findstr "LAN-Verbindung"
Der entsprechende Einzeiler, um die Änderung durchzuführen, könnte so aussehen (Demo am Prompt - wegen des echo wird der netsh-Befehl nur angezeigt, nicht ausgeführt):
for /f "tokens=1-5 delims==" %a in ('netsh interface ip dump^|findstr "mask"^|findstr """LAN-Verbindung"""') do @echo netsh interface ip %a=%b=%c=%d=neueMaske
Mit (angedeutetem) Logging:
for /f "tokens=1-5 delims==" %a in ('netsh interface ip dump^|findstr "mask"^|findstr """LAN-Verbindung"""') do @echo netsh interface ip %a=%b=%c=%d=neueMaske && @for /f %i in ("%d") do @echo Computer: %computername%;IP: %i
[Edit 2] Zusätzliche Anführungszeichen für konkrete Suche nach "LAN-Verbindung" (und nícht zB "LAN-Verbindung 2") nachgetragen [/Edit 2]
[/Edit]

Grüße
bastla
Member: ufo2012
ufo2012 Nov 02, 2009 at 12:38:01 (UTC)
Goto Top
Hallo bastla,

erstmals vielen Dank für die schnelle Antwort und die tolle Lösung.
Leider klappt das nicht so wie Du dir das sicher gedacht hast nicht so.

Der Fehler kommt prompt:
Ich habe Dein Ansatz umgeschrieben:

netsh interface ip dump|findstr "mask"|findstr "LAN-Verbindung"
for /f "tokens=1-5 delims==" %a in ('netsh interface ip dump^|findstr "mask"^|findstr "LAN-Verbindung"') do @echo netsh interface ip %a=%b=%c=%d=255.255.0.0 && @for /f %i in ("%d") do @echo Computer: %computername%;IP: %i
pause


Danach spuckt er dies aus:

D:\test>netsh interface ip dump | findstr "mask" | findstr "LAN-Verbindung"

set address name="LAN-Verbindung" source=static addr=166.1.37.42 mask=255.255.255.0
"a" ist syntaktisch an dieser Stelle nicht verarbeitbar.
D:\test>for /f "tokens=1-5 delims==" a=c=i in (" GERS2008007;IP: i



Zwei Bitten habe ich da noch. Kannst Du bitte nur kurz die oben genannten Schritte erklären? Und ich hätte doch gerne gewußt, wie ich Felder aus einer Exceldatei rausziehen kann. Das wäre super.


Danke Dir.

grüßle
heiko
Member: bastla
bastla Nov 02, 2009 at 13:04:30 (UTC)
Goto Top
Hallo ufo2012!

In einem Batch müssen Laufvariable einer "for"-Schleife immer mit doppelten Anführungszeichen geschrieben werden, daher:
netsh interface ip dump|findstr "mask"|findstr "LAN-Verbindung"  
for /f "tokens=1-5 delims==" %%a in ('netsh interface ip dump^|findstr "mask"^|findstr "LAN-Verbindung"') do @echo netsh interface ip %%a=%%b=%%c=%%d=255.255.0.0 && @for /f %%i in ("%%d") do @echo Computer: %computername%;IP: %%i  
pause
Die Schritte:
Da
netsh interface ip dump
zuviel Information (ev auch für mehrere Netzwerkadapter) liefert, muss gefiltert werden - mit
netsh interface ip dump|findstr "mask"^|findstr """LAN-Verbindung"""
(die zusätzlichen Anführungszeichen - trage ich oben auch noch nach - um "LAN-Verbindung" herum sorgen dafür, dass eine "LAN-Verbindung 2" ebenfalls aussortiert wird) werden nur noch jene Zeilen (sollte ja nur noch eine sein) weiterverarbeitet, die die Begriffe "mask" und "LAN-Verbindung" beinhalten.

Anhand der in dieser Zeile enthaltenen "=" kann eine Aufteilung in die 5 Teile ("Tokens") %%a bis %%e vorgenommen werden. Diese Teile werden dann (bis auf den letzten Teil mit der Subnetmaske) wieder kombiniert und durch die gewünschte Maske ergänzt.

Um die IP auslesen zu können, muss der vierte Teil (%%d enthält lt Deinem Beispiel "166.1.37.42 mask") nochmals zerlegt werden (das Leerzeichen, das hiefür benötigt wird, ist ein Standardtrennzeichen und muss nicht angegeben werden, ebenso wird ohne anderweitige Angabe immer das erste Token, hier also alles vor dem ersten Leerzeichen, zurückgegeben) - in %%i steht dann die IP-Adresse.

Die Verknüpfung der beiden Befehle mit "&&" soll schließlich im "Ernstfall" dafür sorgen, dass die Ausgabe der Daten in die Logdatei nur erfolgt, wenn der "netsh"-Befehl mit einem Errorlevel 0 (also ohne Fehler) beendet wurde.
Zum Auslesen einer Excel-Datei mit Batch:
Das ist zunächst eigentlich nur über ein VBScript (und dann kannst Du das Ganze gleich aus Excel heraus per VBA abfackeln) oder den Umweg über (da mehrere Tabellen) mehrere Textdateien (TAB-delimited oder CSV) möglich, und dann müssen immer noch Kriterien dafür vorliegen, was denn nun als IP-Adresse zu interpretieren ist (deshalb auch oben der Hinweis auf die Struktur) - per RegEx ließen sich zwar vermutlich die Adressen auch extrahieren, aber das ganze Verfahren wäre mE unnötig kompliziert (da würde ich noch eher die Daten in Excel zusammenkopieren und ggf per Sortierung eine Liste der Adressen erzeugen).

Grüße
bastla
Member: ufo2012
ufo2012 Nov 02, 2009 at 13:48:46 (UTC)
Goto Top
Super! Funktioniert echt toll.
Langsam verstehe ich netsh.

Vielen Dank bastla.


Noch ein Kleinigkeit: Kann man damit auch das Gateway ändern? Ich muss dafür ein Bsp geben. Ist kompliziert bei uns. Und zwar haben wir noch viele verschiedene Netze, aber weisen auf ein Gateway nur zu (166.1.37.1). Das ist das Problem bei z.B. Symantec Endpoint Protection 11 (routingprobleme). Deshalb wollen wir diese Gateways ändern, wenn unser neuer Router kommt. Zur Zeit haben wir z.B. IPs: 166.1.51.41 255.255.255.0 Gw:166.1.37.1.
Microsoft verträgt das, als übergang wollen wir aus diesem Netz ein B netzmachen, zwar unschön, aber ist ja nur übergangsweise.
Ich hoffe es ist verständlich was ich da versucht habe zu erklären/fragen.

danke nochmals

grüßle

heiko
Member: bastla
bastla Nov 02, 2009 at 15:07:49 (UTC)
Goto Top
Hallo ufo2012!

Freut mich, dass es soweit klappt. face-smile

Zum Thema "Gateway setzen": Schau Dir einfach das (ungefilterte) Ergebnis von
netsh interface ip dump
an - dann brauchst Du vermutlich noch nicht einmal
netsh interface ip /?
Grüße
bastla
Member: ufo2012
ufo2012 Nov 02, 2009 at 15:31:56 (UTC)
Goto Top
Hallo bastla,

ich habe mich doch etwas kompliziert ausgedrückt face-smile
Ich wollte die Gateway ändern und zwar so dass z.B. von der Ip: 166.1.52.41 Gateway 166.1.37.1 auf ip 166.1.52.41 und dem neuen Gateway 166.1.52.1 zugewiesen wird face-smile

geht das auch so schön wie die Subnetmasks?

schönen Abend

grüßle

heiko
Member: bastla
bastla Nov 02, 2009 at 15:37:34 (UTC)
Goto Top
Hallo ufo2012!
netsh interface ip set address name="LAN-Verbindung" gateway=166.1.52.1 gwmetric=0
tut's nicht?

Grüße
bastla
Member: ufo2012
ufo2012 Nov 03, 2009 at 06:42:33 (UTC)
Goto Top
Guten Morgen bastla,

nochmals Danke für die immer schnelle Antwort.
Jetzt will ich das noch ein bißchen schwieriger machen indem der wie im Beispiel oben sich die IP nimmt und dem entsprechend das Gateway anpasst. Im Klartext,

Gegeben PC1: Ip: 166.1.52.41 Gateway 166.1.37.1
Soll: netsh interface ip set address name="LAN-Verbindung" gateway=166.1.52.1 gwmetric=0

Gegeben PC2: Ip: 166.1.28.46 Gateway 166.1.37.1
Soll: netsh interface ip set address name="LAN-Verbindung" gateway=166.1.28.1 gwmetric=0

Kann man beim 3ten Byte eine Variable setzen in diese dann für an das 3te vom Gateway setzen?

Jetzt hol ich mir erst einmal noch nen Kaffee, ich hoffe es war ein bißchen verständlich, was ich da frage face-smile

mfg
Member: bastla
bastla Nov 03, 2009 at 10:29:01 (UTC)
Goto Top
Hallo ufo2012!

Sollte etwa so gehen:
for /f "tokens=1-5 delims==" %%a in ('netsh interface ip dump^|findstr "mask"^|findstr "LAN-Verbindung"') do for /f "tokens=1-4 delims=. " %%i in ("%%d") do echo netsh interface ip set address name="LAN-Verbindung" gateway=166.1.%%k.1 gwmetric=0
Grüße
bastla
Member: ufo2012
ufo2012 Nov 03, 2009 at 13:01:29 (UTC)
Goto Top
Danke bastla,

damit hast Du uns sehr geholfen. Funktioniert einwandfrei!!

Bis zum nächsten mal. face-smile


grüßle
heiko