jschneider
Goto Top

auf Basis eines IP-Ranges Variable setzen

Hallo,

ich tue mich etwas schwer mit folgendem Thema.

Ich möchte am Client die IP-Adresse ermitteln.. ok dann: (z.b. die 10.11.12.13)

entweder nur die ersten 3 digits rausschneiden damit folgendes über bleibt 10.11.12

und dann - jetzt kommts - schauen ob ich für diesen Wert : 10.11.12 einen wert hinterlegt habe.

diese werte könnten quasi so aussehen:
10.11.12 = "ou=Hamburg,dc=meinedomain,dc=com"
10.11.13 = "STuttgart,dc=meinedomain,dc=com"
10.17 = "Muenchen,dc=meinedomain,dc=com"


ich möchte damit erreichen, dass PC's in meine Domäne aufgenommen werden. Und die IP-Adresse soll darüber entscheiden in welcher OU das Computerkonto erzeugt wird.


habt ihr ne Idee ?

Falls ja - vielen Dank

Content-Key: 70591

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

Printed on: April 19, 2024 at 10:04 o'clock

Member: bastla
bastla Oct 10, 2007 at 11:20:51 (UTC)
Goto Top
Hallo jschneider und willkommen im Forum!

Falls die Angabe von "10.17" für München eigentlich "10.11.17" hätte lauten sollen (also ebenfalls die ersten 3 Stellen umfasst) könnte es etwa so gehen:
@echo off & setlocal
set IP=10.11.15.13
set OU=
for %%i in (%IP%) do for /f "tokens=1* delims==" %%a in ('findstr /b "%%~ni" "D:\OU.txt"') do set "OU=%%~b"  

if defined OU (
    echo %OU%
) else (
    echo IP konnte nicht zugeordnet werden.
)
Zusätzlich benötigt wird die Datei "D:\OU.txt" mit folgendem Inhalt:
10.11.12="ou=Hamburg,dc=meinedomain,dc=com"  
10.11.13="STuttgart,dc=meinedomain,dc=com"  
10.11.17="Muenchen,dc=meinedomain,dc=com"  

Grüße
bastla
Member: bastla
bastla Oct 10, 2007 at 11:43:09 (UTC)
Goto Top
... Plan B, falls tatsächlich auch eine Prüfung nur der ersten beiden Stellen der IP erfolgen soll:
@echo off & setlocal
set IP=10.17.15.13

set OU=
for %%i in (%IP%) do for /f "tokens=1* delims==" %%a in ('findstr /b "%%~ni" "D:\OU.txt"') do set "OU=%%~b"  
if defined OU goto :Weiter

for /f "tokens=1,2 delims=." %%i in ('echo %IP%') do for /f "tokens=1* delims==" %%a in ('findstr /b "%%i.%%j" "D:\OU.txt"') do set "OU=%%~b"  
if defined OU goto :Weiter

echo IP konnte nicht zugeordnet werden.
goto :eof

:Weiter
echo %OU%
Es wird zunächst versucht, anhand der ersten 3 Stellen eine Zuordnung zu treffen. Gelingt dies nicht, werden nur die ersten beiden Stellen berücksichtigt.

Grüße
bastla
Member: jschneider
jschneider Oct 10, 2007 at 11:56:14 (UTC)
Goto Top
vielen Dank für die freundliche Begrüßung bastla

ich greife deinen Vorschlag mal auf und verändere Ihn mal leicht face-wink

Änderung 1:

falls keine Zuordnung möglich ist soll eine "Auffang-OU" genutzt werden, damit die Aufnahme der Computer in die Domain nicht daran scheitert. Huh bin ich darauf stolz *gg*


@echo off & setlocal
set IP=10.11.15.13
set OU=
for %%i in (%IP%) do for /f "tokens=1* delims==" %%a in ('findstr /b "%%~ni" "D:\OU.txt"') do set "OU=%%~b"

if defined OU (
echo %OU%
) else (
%OU%="ou=Computer-ohne-Zuordnung,dc=meinedomain,dc=com"
)


Anmerkung 1:

Die IP-Adress Bereiche sind leider nicht so, dass es immer Class-C oder Class-C Bereiche sind.
Am liebsten wäre mir sogar, dass geschaut wird, in welchem definierten Bereich (aus D:\OU.txt)
10.11.12.1 - 10.11.12.254 = "ou=Hamburg,dc=meinedomain,dc=com"
10.11.13.1 - 10.11.12.254 = "ou=Stuttgart,dc=meinedomain,dc=com"
10.17.0.1 - 10.17.20.254 = "ou=Muenchen,dc=meinedomain,dc=com"

die IP-Adresse reinpasst. Also wenn ich z.B. mit der IP 10.10.10.17 komme und das script dann schaut. Aber script technisch sowas zu bewerkstelligen wäre sicher nicht so einfach möglich.

Ich teste es aber mit deinem Vorschlag so mal aus.

Viele Grüße, Jan Schneider
Member: jschneider
jschneider Oct 10, 2007 at 14:05:10 (UTC)
Goto Top
Hallo nochmal...

hier ist ein Zwischenstand meines Scriptes in dem dein teil sich verewigt hat face-wink

cls
@echo off & setlocal
For /F "tokens=14" %%a in ('ipconfig^|find "IPv4"') do (set IP=%%a)   
echo %IP%

set OU=
for %%i in (%IP%) do for /f "tokens=1* delims==" %%a in ('findstr /b "%%~ni" "c:\test\OU.txt"') do set "OU=%%~b"   
if defined OU goto :Weiter

for /f "tokens=1,2 delims=." %%i in ('echo %IP%') do for /f "tokens=1* delims==" %%a in ('findstr /b "%%i.%%j" "c:\test\OU.txt"') do set "OU=%%~b"   
if defined OU goto :Weiter

set OU=ou=nicht-zugeordnete-pcs,dc=meinedomain,dc=com

echo %OU%
goto :eof

:Weiter
echo %OU%

if exist %Windir%\flag\nb.txt set SUBOU="ou=20-Notebook" goto NETDOM  
set SUBOU=ou=10-Desktop

:NETDOM
echo %SUBOU%,%OU%

%SRC%\netdom add %Computername% /Domain:meinedomain /UserD:Admin /PasswordD:password /OU:%SUBOU%,%OU%

jetzt habe ich doch aber glatt noch zwei Fragen

1.
und zwar würde ich gern vor dem ganzen Durchlauf noch die Art des OS abfragen, damit ich innerhalb des Scriptteils
For /F "tokens=14" %%a in ('ipconfig^|find "IPv4"') do (set IP=%%a)   
echo %IP%

den richtigen Suchwert definieren kann. im oben genanten Beispiel suche ich nach "IPv4" (Vista) in Win2k und WinXP reicht es nach "IP-Ad" zu suchen. Das würde ich gerne abfangen durch eine OS-Abfrage

2. Wie bereits in einem anderen Beitrag hier im Forum auch angesprochen habe ich möglicherweise ein Problem mit mehr als einer aktiven Netzwerkkarte.
Die Variable
 %IP% 
wird jedoch mit dem letzten Wert der gefunden wird gefüllt.
Wie kann ich denn meinem Script sagen, dass sobald eine IP-Adresse mit "10." anfängt er entweder weitere ignorieren soll oder aber wenn sie nicht "10." ist einfach weitersuchen soll?

vielen Dank im vorraus für die Mühe
Member: jschneider
jschneider Oct 10, 2007 at 14:43:16 (UTC)
Goto Top
ich beantworte mir mal meine erste Frage selbst wenn ich darf face-wink

cls
@echo off & setlocal
VER | find "XP" > nul  
IF %errorlevel% EQU 0 GOTO XP
VER | find "2000" > nul  
IF %errorlevel% EQU 0 GOTO 2000
VER | find "Microsoft Windows [Version 6" > nul  
IF %errorlevel% EQU 0 GOTO Vista

goto unbekannt
goto IP-Suche

:unbekannt
echo unbekannt
goto IP-Suche


:2000
echo 2000
set IPStr="IP-Ad"  
goto IP-Suche

:XP
echo XP
set IPStr="IP-Ad"  
goto IP-Suche

:Vista
echo Vista
set IPStr="IPv4"  
goto IP-Suche



:IP-Suche
echo %IPStr%

For /F "tokens=14" %%a in ('ipconfig^|find %IPStr%') do (set IP=%%a)   
echo %IP%

set OU=
for %%i in (%IP%) do for /f "tokens=1* delims==" %%a in ('findstr /b "%%~ni" "c:\test\OU.txt"') do set "OU=%%~b"   
if defined OU goto :Weiter

for /f "tokens=1,2 delims=." %%i in ('echo %IP%') do for /f "tokens=1* delims==" %%a in ('findstr /b "%%i.%%j" "c:\test\OU.txt"') do set "OU=%%~b"   
if defined OU goto :Weiter

set OU=ou=nicht-zugeordnete-pcs,dc=meinedomain,dc=com

echo %OU%
goto :eof

:Weiter
echo %OU%

if exist %Windir%\flag\nb.txt set SUBOU="ou=20-Notebook" goto NETDOM  
set SUBOU=ou=10-Desktop

	


:NETDOM
echo %SUBOU%,%OU%

%SRC%\netdom add %Computername% /Domain:meinedomain /UserD:Admin /PasswordD:password /OU:%SUBOU%,%OU%

bleibt noch das Thema mehrfache IPs aufgrund mehrfacher NICs
Member: bastla
bastla Oct 10, 2007 at 16:05:02 (UTC)
Goto Top
Hallo jschneider!

bleibt noch das Thema mehrfache IPs aufgrund mehrfacher NICs
Das wäre ein Abfallprodukt meiner Überlegungen zum Testen auf eine IP-Range ...

Der aktuelle Stand in dieser Hinsicht sieht so aus:
...
...
set VIP=
for /f "tokens=14" %%a in ('ipconfig^|find %IPStr%') do call :ProcessIP %%a  

set "OU=ou=nicht-zugeordnete-pcs,dc=meinedomain,dc=com"  
for /f "tokens=1,2,* delims=_" %%i in (D:\IP2OU.txt) do set UG=%%i & set OG=%%j & set "St=%%~k" & call :Compare "%%i"  
echo OU: %OU%
goto :eof

:ProcessIP
for /f "tokens=1-4 delims=." %%a in ('echo %~1') do set "IP1=00%%a" & set "IP2=00%%b" & set "IP3=00%%c" & set "IP4=00%%d"  
if "%IP1%" neq "0010" goto :eof  
set "IP=%~1"  
set "VIP=%IP1:~-3%.%IP2:~-3%.%IP3:~-3%.%IP4:~-3%"  
goto :eof

:Compare
if "%VIP%" lss "%UG%" goto :eof  
if "%VIP%" gtr "%OG%" goto :eof  
set "OU=%St%"  
goto :eof
Um einen sicheren Vergleich der Gesamt-IP durchführen zu können, muss die Vergleichs-IP (VIP) mit führenden Nullen erstellt werden. Da zu diesem Zweck ohnehin eine Zerlegung in alle 4 Einzelteile erforderlich ist, kann nebenbei auch der erste Teil auf eine Adresse "10" geprüft werden.

Die zugehörige "D:\IP2OU.txt" müsste so aussehen:
010.011.012.001_010.011.012.254_"ou=Hamburg,dc=meinedomain,dc=com"  
010.011.013.001_010.011.013.254_"ou=Stuttgart,dc=meinedomain,dc=com"  
010.017.000.001_010.017.020.254_"ou=Muenchen,dc=meinedomain,dc=com"  

Grüße
bastla
Member: jschneider
jschneider Oct 11, 2007 at 09:18:21 (UTC)
Goto Top
sorry für edit, habe fehler gefunden den ich angefragt habe
Member: jschneider
jschneider Oct 16, 2007 at 09:14:17 (UTC)
Goto Top
Hallo bastla, hallo wer sonst noch evtl eine Antwort findet

Ich hänge gerade an einem Syntax-Problem in folgender Zeile

...
 for /f "tokens=1,2,* delims=_" %%i in (C:\mein test\IP2OU.txt) do set UG=%%i & set  
 OG=%%j & set "St=%%~k" &  
 

irgendwie bin ich zu dumm für den Fall, dass in der Pfadangabe zur IP2OU.txt ein Lerzeichen enthalten ist.

Vielen Dank,

Jan Schneider
Member: bastla
bastla Oct 16, 2007 at 09:38:36 (UTC)
Goto Top
Hallo jschneider!

Immer in Batch: Dateinamen / Pfade mit Leerzeichen in Anführungszeichen einschließen.
Im Zusammenhang mit "for" musst Du hier auch noch "usebackq" verwenden, daher also:
for /f "usebackq tokens=1,2,* delims=_" %%i in ("C:\mein test\IP2OU.txt") do set UG=%%i & set  
 OG=%%j & set "St=%%~k" & ...  

Grüße
bastla