Question Ip range

Plus d'informations
il y a 15 ans 9 mois #7086 par Arthur
Ip range a été créé par Arthur
Voici une fonction qui génère des adresses ip à partir d'un \"Ip range\"
ex :
[code:1]PS D:\> Import-Module '.\Ip range.ps1'
PS D:\> [string[]]$ip = Ip-range 192.168.1.20-192.168.1.30
PS D:\> $ip
192.168.1.20
192.168.1.21
192.168.1.22
192.168.1.23
192.168.1.24
192.168.1.25
192.168.1.26
192.168.1.27
192.168.1.28
192.168.1.29
192.168.1.30[/code:1]

Source :

[code:1]Function Ip-range {
param([string]$Iprange)
$count = 0
[String[]]$ip2 = $Iprange -split\"-\"
$nb = 0

$ip2 | foreach {
$nb++
}
if( $nb -eq 1 )
{
[string[]]$liste_ip2 = $ip2
}
else
{


$ip2 | foreach {
$count ++
$longeur = $_.length
$ip_char = $_.ToCharArray()
for ( $i = 0 ; $i -le $longeur ; $i++ ) { if( $ip_char[$i] -eq \".\"«») { $a = $i } }


if($count -eq 1 ) {
$ip3 += $_.substring($a+1)
[int]$k = $ip3[0] + $ip3[1] + $ip3[2]
}
if($count -eq 2 ) {
$ip3_bis += $_.substring($a+1)
[int]$j = $ip3_bis[0] + $ip3_bis[1] + $ip3_bis[2]
}



$ip_res = $_.substring(0,$a+1)

for ( $i = $k ; $i -le $j ; $i++ ) {

$liste_ip += \"$ip_res\" + \"$i\" + \"`n\"

}
}

[string[]]$liste_ip2 = $liste_ip -split \"`n\"

}

return $liste_ip2
}[/code:1]

Le script n'est pas exempt de défauts il lui manque encore des vérifications et il faudrait pouvoir lui implémenter un masque sous-réseau,il faut encore que je le commente je le ferai ce soir :laugh: .
J'apporterai ces améliorations par la suite.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7097 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Ip range
L'usage de Import-Module dans Import-Module '.\Ip range.ps1' n'est pas nécessaire et prête même à confusion. Sous PS v2 on utilise un module si on souhaite disposer d'une partie publique et d'une partie privée.
A priori cela ne semble pas le cas ici. Et quitte à s'appuyer sur un module afin de libérer du code autant utiliser l'extension dédié .psm1

En utilisant le nommage New-RangeIP on respecte le format verbe-nom, dans ce cas, à mon avis, mieux vaut placer la notion 'IP' en fin de nom. Ainsi on facilite la recherche des commandes dont le nom finit par IP.
Avec cette approche on se laisse la possibilité de proposer d'autres commandes de création d'étendue, mais portant sur une autre ressource (New-RangeXXX) (gcm *-Range*).
Ainsi le nommage des scripts restent cohérent au fur et à mesure des besoins. Ce point est primordiale pour faciliter l'adoption de vos scripts par la communauté.
Cohérence et pas co-errance :-)

Concernant les paramètres, l'usage de deux paramètres $IpRangeStart et $IpRangeEnd me semble préférable car ils facilitent la mémorisation.
La notion d'étendue porte celle d'un début et d'une fin.
[code:1]
Function New-RangeIP {
param(
#[ValidatePattern(\"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\"«»)]
[ValidateNoteNullOrEmpty()]
[string] $IpRangeStart
#[ValidatePattern(\"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\"«»)]
[ValidateNoteNullOrEmpty()]
[string] $IpRangeEnd
)
[/code:1]
Le pb avec le formalisme que tu utilises, le caractère '-', c'est qu'il différe de celui de PS qui lui utilise la suite de caractères '..' pour signifier une étendue.
Pour rester cohérent le mieux serait d'utiliser le même.
On peut aussi, étant sous PS v2, utiliser un jeux de paramètres précisant soit le formalisme de 2 bornes( -Start x -End Y) soit une étendue (Start..End)

Ton script est une très bonne idée, mais son implémentation est à revoir.
Par exemple tu peux simplifier une partie des vérifications en utilisant la classe dotnet [system.net.ipaddress], elle aide à simplifier les vérifications, mais pas toutes :
[code:1]
$IpRangeStart=\"192.168.1.20\"
$IpRangeEnd=\"192.168.1.30\"
$ips = [system.net.ipaddress[]]@($IpRangeStart,$IpRangeEnd)
ips[0]
$ips.GetAddressBytes()
#erreurs
$ips = [system.net.ipaddress]\"ip de toto\"
$ips = [system.net.ipaddress]\"355.168.1.20\"
#Attention construction d'adresse valide
#régles utilisées ?
$ips = [system.net.ipaddress]\"192.168.1\"
$ips = [system.net.ipaddress]\"192.168\"
$ips = [system.net.ipaddress]\"192\"
#IpV6
$ips = [system.net.ipaddress]\"1050:0000:0000:0000:0005:0600:300c:326b\"
ips.AddressFamily
[/code:1]
Autre point, ton script doit émettre dans le pipeline les adresses IP les une aprés les autres et pas un seul tableau.

Encore une fois l'idée de ce script est trés intéressante et correspondant à un vrai besoin.
Tu devrais prendre le temps de le peaufiner, ce ne sera pas, à mon avis, du temps de perdu !<br><br>Message édité par: Laurent Dardenne, à: 8/06/10 19:52

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7099 par Arthur
Réponse de Arthur sur le sujet Re:Ip range
Merci de tes conseils Laurent!
J'étais sûr qu'il y avait une classe dotnet pour les adresses IP mais je ne l'avais pas trouvé.
Je vais apporter des améliorations dans la semaine et peut être même ajouter une option pour le masque sous réseau!

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7102 par Arthur
Réponse de Arthur sur le sujet Re:Ip range
Voici la nouvelle fonction un peu mieux :

[code:1]Function New-RangeIP {
param([string]$IpRangeStart,[string]$IpRangeEnd)

[int[]]$tabip1
[int[]]$tabip2
$count = 0
$count2 = 0
$ips = [system.Net.IPAddress[]]@($IpRangeStart,$IpRangeEnd)

$ips | foreach {
if($count -eq 0 )
{
[int[]]$tabip1 = $_.GetAddressBytes()
}
if($count -eq 1 )
{
[int[]]$tabip2 = $_.GetAddressBytes()
}
$count++
}
$difip0 = $tabip2[0] - $tabip1[0]
$difip1 = $tabip2[1] - $tabip1[1]
$difip2 = $tabip2[2] - $tabip1[2]
$difip3 = $tabip2[3] - $tabip1[3]

if($difip2 -gt 0)
{
$ip_unique = $tabip1[2]

for($i = $tabip1[3] ;$i -le 255 ; $i++ )
{
[string[]]$RangeIp += \&quot;$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \&quot;
$count2++
}
$ip_unique = $ip_unique + 1

while($ip_unique -ne $tabip2[2])
{
for($i = 0 ;$i -le 255 ; $i++ )
{
[string[]]$RangeIp += \&quot;$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \&quot;
$count2++
}
$ip_unique = $ip_unique + 1
}
for($i = 0 ;$i -le $tabip2[3] ; $i++ )
{
[string[]]$RangeIp += \&quot;$($tabip2[0]).$($tabip2[1]).$($ip_unique).$i \&quot;
}
}
elseif($difip3 -gt 0)
{
for($i = $tabip1[3] ;$i -le $tabip2[3] ; $i++ )
{
[string[]]$RangeIp += \&quot;$($tabip2[0]).$($tabip2[1]).$($tabip2[2]).$i \&quot;
}
}
return $RangeIp
}

[/code:1]

Autre point, ton script doit émettre dans le pipeline les adresses IP les une aprés les autres et pas un seul tableau.


Je ne voit pas trop ce que tu veux dire? :dry:



[code:1]PS D:\&gt; New-RangeIP -IpRangeStart 192.168.0.20 -IpRangeEnd 192.168.3.30
192.168.0.20
192.168.0.21
192.168.0.22
192.168.0.23
192.168.0.24
192.168.0.25
192.168.0.26
192.168.0.27
192.168.0.28
.
.
.
192.168.3.20
192.168.3.21
192.168.3.22
192.168.3.23
192.168.3.24
192.168.3.25
192.168.3.26
192.168.3.27
192.168.3.28
192.168.3.29
192.168.3.30
[/code:1]

Il manque encore pas mal de choses encore, je verrai à la prochaine pause café :P
J'aimerais faire une vérification avec un \&quot;Try\&quot; et un \&quot;catch\&quot; pour faire plus beau mais je ne voit pas trop comment.. une piste? :P
Il faut aussi rendre la fonction plus \&quot;générique\&quot;, pour le moment elle ne marche que pour les 2 derniers octets<br><br>Message édité par: bilbao, à: 9/06/10 11:30

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7104 par Arthur
Réponse de Arthur sur le sujet Re:Ip range
Voilà je suis en train de faire marcher la fonction pour toutes les ip possibles et inimaginables :P
Seulement mon script ne se termine pas il tourne à l'infini. :pinch:
Il me semble que les tableau ont une taille maximale.
Et donc je pense que mon tableau d'ip est \&quot;full\&quot;:pinch:

[code:1]Function Increase-IP {
param([int]$difip,[int[]]$tabip1,[int[]]$tabip2,[int]$Octet)


if($difip -gt 0)
{
$ip_unique = $tabip1[$Octet]
$oct = $Octet + 1
for($i = $tabip1[$oct] ;$i -le 255 ; $i++ )
{
#[string[]]$RangeIp += \&quot;$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \&quot;
$count2++

switch ($Octet)
{
0 { for($a =$tabip1[1] ;$a -le 255 ; $a++ ) { for($b = $tabip1[2] ;$b -le 255 ; $b++ ) {[string[]]$RangeIp += \&quot;$ip_unique.$i.$a.$b \&quot;}}}
1 { for($a =$tabip1[2] ;$a -le 255 ; $a++ ) {[string[]]$RangeIp += \&quot;$($tabip2[0]).$ip_unique.$i.$a \&quot; }}
2 { [string[]]$RangeIp += \&quot;$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \&quot; }
}
}
$ip_unique = $ip_unique + 1
while($ip_unique -ne $tabip2[2])
{
for($i = 0 ;$i -le 255 ; $i++ )
{
#[string[]]$RangeIp += \&quot;$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \&quot;
switch ($Octet)
{
0 { for($a =0 ;$a -le 255 ; $a++ ) { for($b = 0 ;$b -le 255 ; $b++ ) {[string[]]$RangeIp += \&quot;$ip_unique.$i.$a.$b \&quot;}}}
1 { for($a =0 ;$a -le 255 ; $a++ ) {[string[]]$RangeIp += \&quot;$($tabip2[0]).$ip_unique.$i.$a \&quot; }}
2 { [string[]]$RangeIp += \&quot;$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \&quot; }
}
$count2++
}
$ip_unique = $ip_unique + 1
}

for($i = 0 ;$i -le $tabip2[3] ; $i++ )
{
#[string[]]$RangeIp += \&quot;$($tabip2[0]).$($tabip2[1]).$($ip_unique).$i \&quot;
switch ($Octet)
{
0 { for($a =0 ;$a -le $tabip2[1] ; $a++ ) { for($b = 0 ;$b -le $tabip2[2] ; $b++ ) {[string[]]$RangeIp += \&quot;$ip_unique.$i.$a.$b \&quot;}}}
1 { for($a =0 ;$a -le $tabip2[2] ; $a++ ) {[string[]]$RangeIp += \&quot;$($tabip2[0]).$ip_unique.$i.$a \&quot; }}
2 { [string[]]$RangeIp += \&quot;$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \&quot; }
}
}
}
return $RangeIp
}

Function New-RangeIP {
param([string]$IpRangeStart,[string]$IpRangeEnd)

[int[]]$tabip1
[int[]]$tabip2
$count = 0
$count2 = 0
$ips = [system.Net.IPAddress[]]@($IpRangeStart,$IpRangeEnd)

$ips | foreach {
if($count -eq 0 )
{
[int[]]$tabip1 = $_.GetAddressBytes()
}
if($count -eq 1 )
{
[int[]]$tabip2 = $_.GetAddressBytes()
}
$count++
}
$difip0 = $tabip2[0] - $tabip1[0]
$difip1 = $tabip2[1] - $tabip1[1]
$difip2 = $tabip2[2] - $tabip1[2]
$difip3 = $tabip2[3] - $tabip1[3]



if($difip0 -gt 0)
{
Increase-IP -Octet \&quot;0\&quot; -difip $difip0 -tabip1 $tabip1 -tabip2 $tabip2
}
elseif($difip1 -gt 0)
{
Increase-IP -Octet \&quot;1\&quot; -difip $difip1 -tabip1 $tabip1 -tabip2 $tabip2
}
elseif($difip2 -gt 0)
{
Increase-IP -Octet \&quot;2\&quot; -difip $difip2 -tabip1 $tabip1 -tabip2 $tabip2
}
elseif($difip3 -gt 0)
{
for($i = $tabip1[3] ;$i -le $tabip2[3] ; $i++ )
{
[string[]]$RangeIp += \&quot;$($tabip2[0]).$($tabip2[1]).$($tabip2[2]).$i \&quot;
return $RangeIp
}
}
}[/code:1]<br><br>Message édité par: bilbao, à: 9/06/10 12:35

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 9 mois #7105 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Ip range
bilbao écrit:

Autre point, ton script doit émettre dans le pipeline les adresses IP les une aprés les autres et pas un seul tableau.


Je ne voit pas trop ce que tu veux dire ?

Il est préférable de renvoyer la nouvelle addresse au lieu de l'insérer dans un tableau, qui lui est émit en fin de traitement. Le mieux est d'utilser le bloc process pour émettre les adresses au fur et à mesure de leur création.

bilbao écrit:

J'aimerais faire une vérification avec un \&quot;Try\&quot; et un \&quot;catch\&quot; pour faire plus beau mais je ne voit pas trop comment.. une piste?

Le try /catch/finally concerne la gestion d'erreur, je ne vois pas où tu souhaites utiliser cette construction...
bilbao écrit:

Il faut aussi rendre la fonction plus \&quot;générique\&quot;

Oui c'est un peu la difficulté. J'ai un doute sur ton approche, le dernier code est trop dense.

Pour la construction de l'étendue, puisqu'on sait parser les parties de l'adresse, il est peut être préférable d'utiliser l'opérateur natif de PS :
[code:1]($IpRangeEnd -split '\.')[-1]..($IpRangeStart -split '\.')[-1]|% {[system.net.ipaddress]\&quot;192.168.1.$_\&quot;}[/code:1]

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.052 secondes
Propulsé par Kunena