IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

DHCP - Trouver une adresse IP libre et la réserver [Batch]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Par défaut DHCP - Trouver une adresse IP libre et la réserver
    Bonjour,

    J'essaye d'écrire un script batch permettant de :
    - trouver et supprimer un ancien bail DHCP pour une adresse MAC donnée,
    - trouver et réserver une nouvelle adresse IP dans une étendue donnée.

    Le début du script est fonctionnel. Bien que le code puisse sans doute être optimisé.
    En revanche, je ne sais pas comment écrire ceci : par exemple, balayer chacune des adresses IP de 192.168.1.2 à 19.168.3.254.

    Voici le code actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    @echo off
    cls
    setlocal enabledelayedexpansion
    
    rem Demande de saisir une adresse MAC
    set /p mac="Adresse MAC [00-aa-11-bb-22-cc] : "
    set /p scope="Adresse etendue [10.10.10.0] : "
    echo Recherche d'une IP dans le serveur DHCP...
    
    rem Liste l'ensemble des etendues DHCP
    for /f "tokens=1" %%i in ('netsh dhcp server 20.20.20.20 show scope ^| findstr 10.10.*.*') do (
    	rem Recheche dans chaque etendue l'adresse MAC saisie
    	for /f "tokens=1" %%j in ('netsh dhcp server 20.20.20.20 scope %%i show clients ^| findstr %mac%') do ( 
    		rem Supprime l'ancien bail
    		netsh dhcp server 20.20.20.20 scope %%i delete lease %%j
    		rem Affiche l'adresse IP trouvee
    		for /f "tokens=1 delims=-" %%k in ('netsh dhcp server 20.20.20.20 show scope ^| findstr %%i') do set rzo=%%k
    		set rzo=!rzo: =!
    		for /f "tokens=4 delims=-" %%l in ('netsh dhcp server 20.20.20.20 show scope ^| findstr %%i') do set name=%%l
    		echo IP supprimee : [!rzo! - !name!] %%j
    	)
    )
    
    rem Determine la première adresse IP de l'etendue
    for /f "tokens=1 delims=-" %%m in ('netsh dhcp server 20.20.20.20 scope %scope% show iprange') do set debut=%%m
    set debut=!debut: =!
    rem Determine la dernière adresse IP de l'etendue
    for /f "tokens=2 delims=-" %%n in ('netsh dhcp server 20.20.20.20 scope %scope% show iprange') do set fin=%%n
    set fin=!fin: =!
    
    rem Balaye l'ensemble des IP de l'etendue
    	//
    	//
    	rem Verifie si l'adresse IP est deja utilisee
    	for /f "delims=" %%o in ('netsh dhcp server 20.20.20.20 scope %scope% show clients ^| findstr %ip%') do (
    		if %%o EQU "" set ip=%%o
    		rem Reserve l'adresse IP disponible	
    		netsh dhcp server 20.20.20.20 scope %scope% add reservedip %ip% %mac%
    		rem Affiche l'adresse IP reservee
    		echo IP reservee : %ip%
    		pause
    		goto :eof
    	)
    	//
    	//
    pause
    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Par défaut
    Bonjour,

    J'ai avancé un peu. Voici le code actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    @echo off
    cls
    setlocal enabledelayedexpansion
    
    rem Demande de saisir une adresse MAC
    set /p mac="Adresse MAC [00-aa-11-bb-22-cc] : "
    set /p scope="Adresse etendue [10.10.10.0] : "
    
    rem Liste l'ensemble des etendues DHCP
    for /f "tokens=1" %%i in ('netsh dhcp server 20.20.20.20 show scope ^| findstr 10.10.*.*') do (
    	
    	rem Recheche dans chaque etendue l'adresse MAC saisie
    	for /f "tokens=1" %%j in ('netsh dhcp server 20.20.20.20 scope %%i show clients ^| findstr %mac%') do ( 
    		
    		rem Supprime l'ancien bail
    		netsh dhcp server 20.20.20.20 scope %%i delete lease %%j
    		goto :resa
    	)
    )
    
    :resa
    rem Determine l'adresse IP de debut
    for /f "tokens=1 delims=-" %%l in ('netsh dhcp server 20.20.20.20 scope %scope% show iprange') do set ip_debut=%%l
     
    rem Determine le troisieme octect de l'adresse IP de debut
    for /f "tokens=3 delim=." %%m in ('%ip_debut%') do set ip_debut_3=%%m
     
    rem Determine le quatrieme octect de l'adresse IP de debut
    for /f "tokens=4 delim=." %%r in ('%ip_debut%') do set ip_debut_4=%%r
     
    rem Determine l'adresse IP de fin
    for /f "tokens=2 delims=-" %%s in ('netsh dhcp server 20.20.20.20 scope %scope% show iprange') do set ip_fin=%%s
     
    :lst
    rem Liste l'ensemble des IP de l'etendue
    for /L %%v in (%%r,1,255) do (
                   
        rem Incremente l'adresse IP courante
        set ip_courante="10.10."!ip_debut_3!%%v
                   
        rem S'assure que l'adresse IP de fin n'est pas depassee
        if !ip_courante! GTR !ip_fin! do (
            echo L'etendue ne dispose plus d'adresse IP disponible !
            goto :fin
        )
                   
        rem Verifie si l'adresse IP courante est deja utilisee
        for /f "delims=" %%w in ('netsh dhcp server 20.20.20.20 scope %scope% show clients ^| findstr %ip_courante%') do (
            if %%w EQU [] do (
                
    	    rem Retire les tirets de l'adresse MAC
                set mac=!mac:-=!
                                                  
                rem Reserve une IP disponible
                ::netsh dhcp server 20.20.20.20 scope %scope% add reservedip %ip_courante% %mac%
                rem Affiche l'adresse IP reservee
                echo Nouvelle adresse IP reservee : [!scope!] !ip_courante!
                goto :fin
            )
        )
                   
        rem S'assure de ne pas depasse 255 (incremente le troisieme octet)
        if %%v EQU 255 do (
            set %%r=1
            set /A ip_debut_3+=1
            goto :lst
        )
    )
     
    :fin
    pause
    Je rencontre un problème avec le code en rouge. En effet, je fais appel à la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    netsh dhcp server 20.20.20.20 scope %scope% show iprange
    
    Le contexte de multi-étendue en cours a été changé‚ pour la multi-étendue 10.10.10.0.
     
    =============================================================
       Adresse début   -    Adresse fin    -     Type adresse   
    =============================================================
       10.10.10.1    -   10.10.10.253  -  DHCP SEULEMENT
     
    Nb de plages IP : 1 dans l'étendue : 10.10.10.0.
     
    La commande s'est terminée correctement.
    Comment, dans ce résultat, puis-je extraire l'adresse IP de début (ou de fin) uniquement ?

    Merci

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Avec un "for /f" bien sur. Tu peux trouver la bonne ligne avec ceci :
    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    | findstr /r "[0-9]\.[0-9].*\.[0-9].*\.[0-9].*-.*[0-9]\.[0-9].*\.[0-9].*\.[0-9]"

    Tu n'a plus qu'a ajouter les délimiteurs espace et - puis choisir les 2 tokens qui t’intéresse

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Par défaut
    Bonjour,

    Merci pour cette réponse, j'ai pu terminer.

    Je partage le code ici si cela peut servir à quelqu'un plus tard.

    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
    @echo off
    cd /d %~dp0
    if exist Export.txt del Export.txt > nul 2>&1
    cls
    setlocal enabledelayedexpansion
     
    echo ## Ajout d'une reservation DHCP ##
    echo.
     
    rem Demande de saisir une adresse MAC
    set /p mac="Quelle est l'adresse MAC [00aa11bb22cc] : "
     
    rem Memorise l'adresse MAC en majuscules
    for /f "delims=" %%c in ("!mac!") do (
    	set "mac_maj=%%c"
    	for %%d in (A B C D E F) do set "mac_maj=!mac_maj:%%d=%%d!"
    )
     
    rem Memorise l'adresse MAC en minuscules
    for /f "delims=" %%e in ("!mac!") do (
    	set "mac_min=%%e"
    	for %%f in (a b c d e f) do set "mac_min=!mac_min:%%f=%%f!"
    )
     
    rem Memorise l'adresse MAC avec des tirets
    set mac_tirets=!mac_min:~0,2!-!mac_min:~2,2!-!mac_min:~4,2!-!mac_min:~6,2!-!mac_min:~8,2!-!mac_min:~10,2!
     
    rem Determine s'il s'agit d'une imprimante
    set imp=n
    editv64 -p "S'agit-il d'une imprimante [o/n] : " imp
    rem Definit l'adresse IP de l'etendue
    if imp==n (
    	set scope=10.10.10.0
    )else (
    	set scope=10.10.11.0
    )
     
    rem Il est preferable que la machine ne soit pas connectee au reseau
    echo.
    if imp==n (
    	pause>nul|set /p "=Appuyez sur une touche lorsque l'ordinateur sera deconnecte du reseau..."<nul&echo(
    )else (
    	pause>nul|set /p "=Appuyez sur une touche lorsque l'imprimante sera deconnectee du reseau..."<nul&echo(
    )
     
    echo.
    echo # Recherche d'une ancienne adresse IP dans le serveur DHCP...
    echo.
     
    rem Liste l'ensemble des etendues DHCP
    for /f "tokens=1" %%i in ('netsh dhcp server 20.20.20.20 show scope ^| findstr /r 10.10.*.*') do (
    	rem Recheche dans chaque etendue l'adresse MAC saisie
    	for /f "tokens=1" %%j in ('netsh dhcp server 20.20.20.20 scope %%i show clients ^| findstr !mac_tirets!') do ( 
    		rem Supprime l'ancien bail
    		netsh dhcp server 20.20.20.20 scope %%i delete reservedip %%j !mac_min! > nul 2>&1
    		netsh dhcp server 20.20.20.20 scope %%i delete lease %%j > nul 2>&1 
    		rem Affiche l'adresse IP trouvee
    		for /f "tokens=1 delims=-" %%k in ('netsh dhcp server 20.20.20.20 show scope ^| findstr %%i') do set rzo=%%k
    		set rzo=!rzo: =!
    		echo [!rzo!] %%j
    	)
    )
     
    echo.
    echo # Recherche d'une nouvelle adresse IP dans l'etendue...
    echo.
     
    rem Determine la plage IP de l'etendue DHCP
    for /f "tokens=*" %%l in ('netsh dhcp server 20.20.20.20 scope !scope! show iprange ^| findstr /r "[0-9]\.[0-9].*\.[0-9].*\.[0-9].*-.*[0-9]\.[0-9].*\.[0-9].*\.[0-9]"') do set plage_ip=%%l
     
    rem Determine le troisieme octect de l'adresse IP de debut
    for /f "tokens=3 delims=." %%m in ("!plage_ip!") do set ip_debut_3=%%m
     
    rem Determine le quatrieme octect de l'adresse IP de debut
    for /f "tokens=4 delims=.,-" %%n in ("!plage_ip!") do set ip_debut_4=%%n
    set ip_debut_4=!ip_debut_4: =!
     
    rem Determine le troisieme octect de l'adresse IP de fin
    for /f "tokens=6 delims=." %%o in ("!plage_ip!") do set ip_fin_3=%%o
     
    rem Determine le quatrième octet de l'adresse IP de fin
    for /f "tokens=8 delims=.,-" %%p in ("!plage_ip!") do set ip_fin_4=%%p
    set ip_fin_4=!ip_fin_4: =!
     
    rem Exporte la liste des IP utilisees
    netsh dhcp server 20.20.20.20 scope !scope! show clients > Export.txt
     
    :lst
    rem Liste l'ensemble des IP de l'etendue
    for /L %%q in (!ip_debut_4!,1,255) do (
    	rem Incremente l'adresse IP courante
    	set ip_courante=10.10.!ip_debut_3!.%%q
    	rem S'assure que l'adresse IP de fin n'est pas depassee
    	if !ip_debut_3! GEQ !ip_fin_3! (
    		if %%q GTR !ip_fin_4! (
    			echo L'etendue ne dispose plus d'adresse IP disponible !
    			goto :fin
    		)
    	)
    	rem Verifie si l'adresse IP courante est deja utilisee
    	findstr "\<!ip_courante!\>" Export.txt >nul 2>&1
    	if !errorlevel!==1 (
    		rem Reserve une IP disponible
    		if imp==n (
    			netsh dhcp server 20.20.20.20 scope !scope! add reservedip !ip_courante! !mac_min! PC!mac_maj! > nul 2>&1
    		)else (
    			netsh dhcp server 20.20.20.20 scope !scope! add reservedip !ip_courante! !mac_min! IMP!mac_maj! > nul 2>&1
    		)
    		rem Affiche l'adresse IP reservee
    		if !errorlevel!==0 (
    			echo [!scope!] !ip_courante!
    			goto :ping
    		)else (
    			echo La reservation de l'adresse IP !ip_courante! a echoue !
    			goto :fin
    		)
    	)
    	rem S'assure de ne pas depasser 255 (incremente le troisieme octet)
    	if %%q EQU 255 (
    		set /A ip_debut_3+=1
    		set ip_debut_4=1
    		goto :lst
    	)
    )
     
    :ping
    rem C'est le moment de rebrancher la machine
    echo.
    if imp==n (
    	pause>nul|set /p "=Appuyez sur une touche lorsque l'ordinateur sera connecte au reseau..."<nul&echo(
    )else (
    	pause>nul|set /p "=Appuyez sur une touche lorsque l'imprimante sera connectee au reseau..."<nul&echo(
    )
     
    rem Lance un ping continu vers l'adresse IP reservee
    echo.
    echo # Tentative de ping vers la nouvelle adresse IP reservee...
    if exist Export.txt del Export.txt > nul 2>&1
    ping -t !ip_courante!
     
    :fin
    if exist Export.txt del Export.txt > nul 2>&1
    @pause

    A bientôt

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Dans la première balise de code essaie de mettre ceci CODE=batch

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trouver une adresse IP depuis un Nom
    Par theMonz31 dans le forum C#
    Réponses: 2
    Dernier message: 12/12/2014, 09h22
  2. [XL-2010] Trouver une adresse relative à Target.adress
    Par Excel_man dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/11/2013, 22h09
  3. Problème pour trouver une adresse de cellule
    Par Runsh63 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 28/09/2011, 17h02
  4. [RegEx] Trouver une adresse e-mail dans un texte
    Par Lo-chan dans le forum Langage
    Réponses: 6
    Dernier message: 07/11/2007, 12h07
  5. Trouver une adresse mail dans un fichier word
    Par vonitiana dans le forum Langage
    Réponses: 18
    Dernier message: 09/06/2006, 17h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo