Question Ip range
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
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
J'apporterai ces améliorations par la suite.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
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.
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
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.
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
[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 += \"$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \"
$count2++
}
$ip_unique = $ip_unique + 1
while($ip_unique -ne $tabip2[2])
{
for($i = 0 ;$i -le 255 ; $i++ )
{
[string[]]$RangeIp += \"$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \"
$count2++
}
$ip_unique = $ip_unique + 1
}
for($i = 0 ;$i -le $tabip2[3] ; $i++ )
{
[string[]]$RangeIp += \"$($tabip2[0]).$($tabip2[1]).$($ip_unique).$i \"
}
}
elseif($difip3 -gt 0)
{
for($i = $tabip1[3] ;$i -le $tabip2[3] ; $i++ )
{
[string[]]$RangeIp += \"$($tabip2[0]).$($tabip2[1]).$($tabip2[2]).$i \"
}
}
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?
[code:1]PS D:\> 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é
J'aimerais faire une vérification avec un \"Try\" et un \"catch\" pour faire plus beau mais je ne voit pas trop comment.. une piste?
Il faut aussi rendre la fonction plus \"générique\", 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.
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
- Messages : 226
- Remerciements reçus 0
Seulement mon script ne se termine pas il tourne à l'infini.
Il me semble que les tableau ont une taille maximale.
Et donc je pense que mon tableau d'ip est \"full\"
[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 += \"$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \"
$count2++
switch ($Octet)
{
0 { for($a =$tabip1[1] ;$a -le 255 ; $a++ ) { for($b = $tabip1[2] ;$b -le 255 ; $b++ ) {[string[]]$RangeIp += \"$ip_unique.$i.$a.$b \"}}}
1 { for($a =$tabip1[2] ;$a -le 255 ; $a++ ) {[string[]]$RangeIp += \"$($tabip2[0]).$ip_unique.$i.$a \" }}
2 { [string[]]$RangeIp += \"$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \" }
}
}
$ip_unique = $ip_unique + 1
while($ip_unique -ne $tabip2[2])
{
for($i = 0 ;$i -le 255 ; $i++ )
{
#[string[]]$RangeIp += \"$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \"
switch ($Octet)
{
0 { for($a =0 ;$a -le 255 ; $a++ ) { for($b = 0 ;$b -le 255 ; $b++ ) {[string[]]$RangeIp += \"$ip_unique.$i.$a.$b \"}}}
1 { for($a =0 ;$a -le 255 ; $a++ ) {[string[]]$RangeIp += \"$($tabip2[0]).$ip_unique.$i.$a \" }}
2 { [string[]]$RangeIp += \"$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \" }
}
$count2++
}
$ip_unique = $ip_unique + 1
}
for($i = 0 ;$i -le $tabip2[3] ; $i++ )
{
#[string[]]$RangeIp += \"$($tabip2[0]).$($tabip2[1]).$($ip_unique).$i \"
switch ($Octet)
{
0 { for($a =0 ;$a -le $tabip2[1] ; $a++ ) { for($b = 0 ;$b -le $tabip2[2] ; $b++ ) {[string[]]$RangeIp += \"$ip_unique.$i.$a.$b \"}}}
1 { for($a =0 ;$a -le $tabip2[2] ; $a++ ) {[string[]]$RangeIp += \"$($tabip2[0]).$ip_unique.$i.$a \" }}
2 { [string[]]$RangeIp += \"$($tabip2[0]).$($tabip2[1]).$ip_unique.$i \" }
}
}
}
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 \"0\" -difip $difip0 -tabip1 $tabip1 -tabip2 $tabip2
}
elseif($difip1 -gt 0)
{
Increase-IP -Octet \"1\" -difip $difip1 -tabip1 $tabip1 -tabip2 $tabip2
}
elseif($difip2 -gt 0)
{
Increase-IP -Octet \"2\" -difip $difip2 -tabip1 $tabip1 -tabip2 $tabip2
}
elseif($difip3 -gt 0)
{
for($i = $tabip1[3] ;$i -le $tabip2[3] ; $i++ )
{
[string[]]$RangeIp += \"$($tabip2[0]).$($tabip2[1]).$($tabip2[2]).$i \"
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
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.
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 ?
bilbao écrit:
Le try /catch/finally concerne la gestion d'erreur, je ne vois pas où tu souhaites utiliser cette construction...J'aimerais faire une vérification avec un \"Try\" et un \"catch\" pour faire plus beau mais je ne voit pas trop comment.. une piste?
bilbao écrit:
Oui c'est un peu la difficulté. J'ai un doute sur ton approche, le dernier code est trop dense.Il faut aussi rendre la fonction plus \"générique\"
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]\"192.168.1.$_\"}[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Contributions à la communauté
- Ip range