Question Ip range

Plus d'informations
il y a 15 ans 9 mois #7106 par Arthur
Réponse de Arthur sur le sujet Re:Ip range

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

Justement quand je rentre une mauvaise Ip avec ma fonction j'obtiens ca :

En faite je voulais éviter de faire des test à la If(... je voulais récupérer les erreurs et en fonction de l'erreur écrire un message plus \"conviviale\" :)
Mais je viens de me rendre compte que quand je rentre une ip : \"192.168.3\" il n'affiche pas d'erreurs. :whistle:
Donc je vais faire des test \"classiques\".

Bon sinon je vais voir pour les autres améliorations
Merci. :)

Edit:
Pourrais tu m'expliquer le \"[-1]..\" et le \"[-1]\" dans :

[code:1]($IpRangeEnd -split '\.')[-1]..($IpRangeStart -split '\.')[-1]|% {[system.net.ipaddress]\"192.168.1.$_\"}[/code:1]

Merci. :pinch:<br><br>Message édité par: bilbao, à: 9/06/10 15:18

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

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

Donc je vais faire des test \&quot;classiques\&quot;.

Pour ce thème, une regex facilitera la gestion des erreurs, en tout cas la validité d'une adresse IP :
[code:1]
#http://www.codekeep.net/snippets/9bd4694c-1d33-415e-b97f-db2f7f07015e.aspx
$reg=\&quot;(?&lt;First&gt;2[0-4]\d|25[0-5]|[01]?\d\d?)\.(?&lt;Second&gt;2[0-4]\d|25\&quot;+
\&quot;[0-5]|[01]?\d\d?)\.(?&lt;Third&gt;2[0-4]\d|25[0-5]|[01]?\d\d?)\.(?\&quot;+
\&quot;&lt;Fourth&gt;2[0-4]\d|25[0-5]|[01]?\d\d?)\&quot;
$regIP = new-object System.Text.RegularExpressions.Regex $reg,\&quot;IgnoreCase,CultureInvariant,IgnorePatternWhitespace,Compiled\&quot;
$Result=$regIP.Match($IpRangeStart)
$Result.Success
#Ou
$IpRangeEnd -match $reg
$matches.Fourth[/code:1]
Le groupes nommés facilitent l'accès aux 4 partiess de l'adresse.

J'ai essayé aussi cette approche pour reconstruire l'adresse, il y a surement mieux :
[code:1]
$IpRangeStart=\&quot;192.168.1.20\&quot;
$IpRangeEnd=\&quot;192.170.4.30\&quot;

$StartAddressByte=([system.net.ipaddress]$IpRangeStart).GetAddressBytes()
$EndAddressByte=([system.net.ipaddress]$IpRangeEnd).GetAddressBytes()

$Section=3
function make($Section) {
Invoke-Expression \&quot;$($StartAddressByte[$section])..$($EndAddressByte[$section])\&quot; |
Foreach {
$ExecutionContext.InvokeCommand.ExpandString(('$($StartAddressByte[0]).$($StartAddressByte[1]).$($StartAddressByte[2]).$($StartAddressByte[3])' -replace \&quot;\`$StartAddressByte\[$Section\]\&quot;,$_))
}
}

make 3
[/code:1]
Reste que je ne sais pas quel comportement tu recherches lors de la génération, souhaites-tu couvrir toutes les plages ?
Exemples
de 192.168.1.20 à 192.168.1.255 puis de 192.168.2.0 à 192.168.2.255 etc jusqu'à 192.170.4.30

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 9 mois #7108 par Arthur
Réponse de Arthur sur le sujet Re:Ip range

Reste que je ne sais pas quel comportement tu recherches lors de la génération, souhaites-tu couvrir toutes les plages ?
Exemples
de 192.168.1.20 à 192.168.1.255 puis de 192.168.2.0 à 192.168.2.255 etc jusqu'à 192.170.4.30


Oui c'est ca ! C'est exactement ce que je fait .
Ça marche que pour les 2 derniers octets après je bloque
(Je doute que l'on utilise souvent des adresses en dessous de type /16, ou alors on gère un très grand réseau :laugh: mais bon je le fait pour apprendre Powershell :laugh: )

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

Plus d'informations
il y a 15 ans 9 mois #7109 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Ip range
Si tu n'y pas vois d'inconvénient on va appliquer un des principes de l'objet, la réutilisation :
[code:1]
$source = @\&quot;
// From technosrix.blogspot.com/2009/05/how-to-g...sses-from-given.html
//Renvoi une étendue d'adresse IP
using System;
using System.Collections;
using System.Net;

namespace PowerShell.Tools
{
public class IpRange
{
public static ArrayList GetIpAdressFromRange(string fromIp, string toIp)
{
ArrayList ips = new ArrayList();
IPAddress tmpIP = null;

//generate only for valid set of ips
//Todo: check for toip &gt;fromIp
if (IPAddress.TryParse(fromIp, out tmpIP) == true &amp;&amp;
IPAddress.TryParse(toIp, out tmpIP) == true)
{


string[] fromOct = fromIp.Split('.');

string[] toOct = toIp.Split('.');

string a = null, b = null, c = null, d = null;

int startA = Convert.ToInt32(fromOct[0]);
int startB = Convert.ToInt32(fromOct[1]);
int startC = 1;
int startD = 1;

int endA = Convert.ToInt32(toOct[0]);
int endB = 255;
int endC = 255;
int endD = 255;


for (int intA = startA; intA &lt;= endA; intA++)
{
a = intA.ToString();

startB = intA == Convert.ToInt32(fromOct[0]) ? Convert.ToInt32(fromOct[1]) : 1;
endB = intA == Convert.ToInt32(toOct[0]) ? Convert.ToInt32(toOct[1]) : 255;

for (int intB = startB; intB &lt;= endB; intB++)
{
b = intB.ToString();

startC = (intA == Convert.ToInt32(fromOct[0])) &amp;&amp; (intB == Convert.ToInt32(fromOct[1])) ?
Convert.ToInt32(fromOct[2]) : 1;
endC = (intA == Convert.ToInt32(toOct[0])) &amp;&amp; (intB == Convert.ToInt32(toOct[1])) ?
Convert.ToInt32(toOct[2]) : 255;


for (int intC = startC; intC &lt;= endC; intC++)
{
c = intC.ToString();

startD = (intA == Convert.ToInt32(fromOct[0])) &amp;&amp; (intB == Convert.ToInt32(fromOct[1])) &amp;&amp; (intC == Convert.ToInt32(fromOct[2])) ?
Convert.ToInt32(fromOct[3]) : 1;
endD = (intA == Convert.ToInt32(toOct[0])) &amp;&amp; (intB == Convert.ToInt32(toOct[1])) &amp;&amp; (intC == Convert.ToInt32(toOct[2])) ?
Convert.ToInt32(toOct[3]) : 255;


for (int intD = startD; intD &lt;= endD; intD++)
{
d = intD.ToString();
ips.Add(a + \&quot;.\&quot; + b + \&quot;.\&quot; + c + \&quot;.\&quot; + d);
}
}
}
}

}
return ips;
}
}
}
\&quot;@

Add-Type -TypeDefinition $source

$range=[PowerShell.Tools.IpRange]::GetIpAdressFromRange(\&quot;192.168.1.20\&quot;, \&quot;192.170.4.30\&quot;«»)
[/code:1]
On 'triche' un peu, mais on gagne du temps :-)

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 9 mois #7110 par Arthur
Réponse de Arthur sur le sujet Re:Ip range
je savait pas qu'on pouvait faire ca. :pinch:
Bon au moins c'est efficace, mais on triche un peu comme tu le dit. :silly:

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

Plus d'informations
il y a 15 ans 9 mois #7148 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Ip range
J'ai converti le code C# en PowerShell au sein d'un module. Un des 'soucis' avec la classe IpAddress est qu'on peut passer un entier au constructeur ou à la méthode Parse. Les qq méthodes du module suivant se basent sur des adresses IP respectant le format \&quot;1.2.3.4\&quot;.
La méthode New-RangeIPAddress ne filtre pas les adresses pouvant être considérées comme interdites/réservées.
[code:1]
#Module IPAdress.psm1
#Routines autour de la gestion d'adresse IP v4

Function Compare-IPAddress{
#Compare deux adresses IP.
#Renvoi :
# -1 si x est inférieur à y.
# 1 si x est supérieur à y.
# 0 si x est égal à y.
param ([String] $IpAddressX,[String] $IpAddressY)

[long]$X=(ConvertTo-IPAddress $IPAddressX).SortableAddress
[long]$Y=(ConvertTo-IPAddress $IPAddressY).SortableAddress

if ($X -lt $Y) {-1}
elseif ($X -gt $Y) {1}
else {0}
}

function Test-DottedQuadNotation {
#renvoi $true si l'adresse contient trois points ('.')
# $true pour \&quot;A.B.C.D\&quot; et \&quot;258.5.1.0\&quot;
# $false pour \&quot;0\&quot; et \&quot;258.5.1\&quot;
param ( [String] $IpAddress )

$dotCount=0;
for($i=0; $i -lt $IpAddress.Length;$i++) {
if ($IpAddress[$i] -eq \&quot;.\&quot;«»)
{$dotCount++}
}
$dotCount -eq 3
}

function Parse-IpAddress {
#renvoi une adresse IP valide ou $null
#On peut générer une adresse à partir d'un seul chiffre, ex : 450
param ( [String] $IpAddress )

[REF] $tmpIP=$null
[void][System.Net.IPAddress]::TryParse($IpAddress,$tmpIP)
$tmpIP.Value
}

Function Test-IPAddress{
#Teste la validité d'une adresse IP respectant le format A.B.C.D
param ( [String] $IpAddress )

(Test-DottedQuadNotation $IpAddress) -and (Parse-IpAddress $IpAddress)
}

Function ConvertTo-IPAddress {
#Convertie une chaîne au format A.B.C.D, en
# une instance de la classe [System.Net.IPAddress]
Param( [ValidateNotNullOrEmpty()]
[String] $IpAddress )
$ip=$null
if (Test-DottedQuadNotation $IpAddress)
{$Ip=Parse-IpAddress $IpAddress}
if ($ip -eq $null)
{Throw \&quot;ConvertTo-IPAddress : L'adresse IP ($IpAddress) est invalide.\&quot;}
$ip
}

Function New-RangeIPAddress{
#Renvoi une étendue d'adresses IP
#L'adresse $fromIp peut être supérieure à $toIp.
#Le résultat obtenu est identique pour les deux appels suivants :
# New-RangeIpAddress \&quot;192.168.1.20\&quot; \&quot;192.168.1.30\&quot;
# New-RangeIpAddress \&quot;192.168.1.30\&quot; \&quot;192.168.1.20\&quot;
#
#Adaptation du code suivant :
# technosrix.blogspot.com/2009/05/how-to-g...sses-from-given.html
Param(
[Parameter(Position=1,Mandatory=$true,HelpMessage=\&quot;Adresse IP de début.\&quot;«»)]
[ValidateNotNullOrEmpty()]
[string] $fromIp,
[Parameter(Position=2,Mandatory=$true,HelpMessage=\&quot;Adresse IP de fin.\&quot;«»)]
[ValidateNotNullOrEmpty()]
[string] $toIp)

process {
if ((Compare-IpAddress $fromIp $toIp) -eq 1)
#Swap
{$fromIp,$toIp=$toIp,$fromIp}

[int[]] $fromOct = ([system.net.ipaddress]$fromIp).GetAddressBytes()

[Int[]] $toOct = ([system.net.ipaddress]$toIp).GetAddressBytes()

[string] $a = [string] $b = [string] $c = $null

[int] $startA = $fromOct[0]
[int] $startB = $fromOct[1]
[int] $startC = [int] $startD = 1

[int] $endA = $toOct[0]
[int] $endB = [int] $endC = [int] $endD = 255

for ($intA = $startA; $intA -le $endA; $intA++)
{
$a = $intA

if ($intA -eq $fromOct[0])
{$startB = $fromOct[1]}
else {$startB = 1}

if ($intA -eq $toOct[0])
{$endB = $toOct[1]}
else {$endB = 255}

for ($intB = $startB; $intB -le $endB; $intB++)
{
$b = $intB

if (($intA -eq $fromOct[0]) -and ($intB -eq $fromOct[1]))
{$startC = $fromOct[2]}
else {$startC = 1}
if ( ($intA -eq $toOct[0]) -and ($intB -eq $toOct[1]))
{$endC = $toOct[2] }
else {$endC = 255}

for ($intC = $startC; $intC -le $endC; $intC++)
{
$c = $intC

if (($intA -eq $fromOct[0]) -and ($intB -eq $fromOct[1]) -and ($intC -eq $fromOct[2]))
{$startD = $fromOct[3]}
else {$startD = 1}

if ( ($intA -eq $toOct[0]) -and ($intB -eq $toOct[1]) -and ($intC -eq $toOct[2]))
{$endD = $toOct[3]}
else {$endD =255}

for ($intD = $startD; $intD -le $endD; $intD++)
{
\&quot;{0}.{1}.{2}.{3}\&quot; -F $a,$b,$c,$intD
} #for $intD
}#for $intC
}#for $intB
}#for $intA
}#Process
}#New-RangeIPAddress

Export-ModuleMember -function Compare-IPAddress,
Test-IPAddress,
ConvertTo-IPAddress,
New-RangeIPAddress

&lt;#
www.indented.co.uk/index.php/2010/01/23/powershell-subnet-math/
( code source sur www.poshcode.com/975)

#Tests
New-RangeIpAddress
New-RangeIpAddress $null $null
New-RangeIpAddress \&quot;\&quot; \&quot;\&quot;
New-RangeIpAddress $null \&quot;\&quot;
New-RangeIpAddress \&quot;\&quot; $null
New-RangeIpAddress $null \&quot;192.168.1.20\&quot;
New-RangeIpAddress \&quot;\&quot; \&quot;192.168.1.20\&quot;
New-RangeIpAddress \&quot;192.168.1.20\&quot; $null
New-RangeIpAddress \&quot;192.168.1.20\&quot; \&quot;\&quot;
New-RangeIpAddress \&quot;Test\&quot; \&quot;192.168.1.22\&quot;
New-RangeIpAddress \&quot;192.168.1.22\&quot; \&quot;Test\&quot;
New-RangeIpAddress \&quot;Test\&quot; \&quot;Test\&quot;
New-RangeIpAddress \&quot;0\&quot; \&quot;1\&quot;
New-RangeIpAddress \&quot;...\&quot; \&quot;...\&quot;
New-RangeIpAddress \&quot;A.0.0.0\&quot; \&quot;192.168.1.20\&quot;
New-RangeIpAddress \&quot;256.0.0.0\&quot; \&quot;192.168.1.20\&quot;
New-RangeIpAddress \&quot;192.168.1.20\&quot; \&quot;392.168.1.20\&quot;
New-RangeIpAddress \&quot;192.168.1.20\&quot; \&quot;192.168.1.20\&quot;
New-RangeIpAddress \&quot;192.168.1.21\&quot; \&quot;192.168.1.20\&quot;
New-RangeIpAddress \&quot;192.168.1.20\&quot; \&quot;192.168.1.22\&quot;

Compare-IPAddress \&quot;256.0.0.0\&quot; \&quot;192.168.1.20\&quot;
Compare-IPAddress $null \&quot;192.168.1.20\&quot;
Compare-IPAddress \&quot;...\&quot; \&quot;...\&quot;
Compare-IPAddress \&quot;192.168.1.20\&quot; \&quot;192.168.1.20\&quot;
Compare-IPAddress \&quot;192.168.1.20\&quot; \&quot;192.168.1.21\&quot;
Compare-IPAddress \&quot;192.168.1.21\&quot; \&quot;192.168.1.20\&quot;


Test-IPAddress
Test-IPAddress $null
Test-IPAddress \&quot;...\&quot;
Test-IPAddress \&quot;A.0.0.0\&quot;
Test-IPAddress \&quot;Test\&quot;
Test-IPAddress \&quot;150\&quot;
Test-IPAddress \&quot;192.168.1.257\&quot;
Test-IPAddress \&quot;192.168.1.\&quot;
Test-IPAddress \&quot;192.168.1.20\&quot;


ConvertTo-IPAddress
ConvertTo-IPAddress $null
ConvertTo-IPAddress \&quot;test\&quot;
ConvertTo-IPAddress \&quot;150\&quot;
ConvertTo-IPAddress \&quot;A.0.0.0\&quot;
ConvertTo-IPAddress \&quot;192.168.1.257\&quot;
ConvertTo-IPAddress \&quot;192.168.1.\&quot;
ConvertTo-IPAddress \&quot;192.168.1.20\&quot;


#membres privés
Parse-IpAddress
Parse-IpAddress \&quot;192.168.1.\&quot;
(Parse-IpAddress \&quot;192.168.1.\&quot;«») -eq $null
Parse-IpAddress \&quot;ssdsds\&quot;
Parse-IpAddress \&quot;A.0.0.0\&quot;
Parse-IpAddress \&quot;192.168.1.257\&quot;
Parse-IpAddress 450
Parse-IpAddress 21474504587
Parse-IpAddress 21514504587
Parse-IpAddress \&quot;192.168.1.2\&quot;

Test-DottedQuadNotation
Test-DottedQuadNotation $null
Test-DottedQuadNotation \&quot;fin.\&quot;
Test-DottedQuadNotation \&quot;...\&quot;
Test-DottedQuadNotation \&quot;1.2.3.\&quot;
Test-DottedQuadNotation \&quot;1.2.3.4\&quot;
Test-DottedQuadNotation \&quot;-1.2.3.4\&quot;
Test-DottedQuadNotation \&quot;A.B.C.D\&quot;
#&gt;
[/code:1]
Le lien dans les commentaires, pointe sur une suite des scripts intéressants. Ces derniers acceptent des entiers, a tester donc.<br><br>Message édité par: Laurent Dardenne, à: 14/06/10 19:26

Tutoriels PowerShell

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

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