Question Fonction d'adressage IP
- Richard Lazaro
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
- Messages : 530
- Remerciements reçus 0
J'ai écris il y a peu un petit script d'adressage IP.
C'est une première version, il me manque à intégrer certaine chose :
- Support IPV6
- Ajout de Verbose et Debug
- Ajout de l'Helper
- Ajout de Commentaire
Mais bon, même si il y a certaines amélioration à apporter, je pense gérer toutes erreurs dans le script.
Si vous avez des idées d'amélioration, faites les moi savoir ;]
Après DotSourcer le script (. ./Get-TMSubnet.ps1), voici son utilisation :
[code:1]PS C:\> . .\Users\richardl.EXAKIS\Desktop\Get-TMSubnet.ps1
PS C:\>
PS C:\> Get-TMSubnet -NetworkAddress 127.0.0.5/22
IpAddress : 127.0.0.5
SubnetMask : 255.255.252.0
WildcardMask : 0.0.3.255
Mask : 22
NumberOfHosts : 1022
NetworkAddress : 127.0.0.0
BroadcastAddress : 127.0.3.255
Hosts : {}
PS C:\> Get-TMSubnet -NetworkAddress 127.0.0.5 -Mask 20
IpAddress : 127.0.0.5
SubnetMask : 255.255.240.0
WildcardMask : 0.0.15.255
Mask : 20
NumberOfHosts : 4094
NetworkAddress : 127.0.0.0
BroadcastAddress : 127.0.15.255
Hosts : {}
PS C:\> '127.4.0.2/22','10.34.0.9/31','165.45.23.0/12' | Get-TMSubnet
IpAddress : 127.4.0.2
SubnetMask : 255.255.252.0
WildcardMask : 0.0.3.255
Mask : 22
NumberOfHosts : 1022
NetworkAddress : 127.4.0.0
BroadcastAddress : 127.4.3.255
Hosts : {}
IpAddress : 10.34.0.9
SubnetMask : 255.255.255.254
WildcardMask : 0.0.0.1
Mask : 31
NumberOfHosts : 0
NetworkAddress : 10.34.0.8
BroadcastAddress : 10.34.0.9
Hosts : {}
IpAddress : 165.45.23.0
SubnetMask : 255.240.0.0
WildcardMask : 0.15.255.255
Mask : 12
NumberOfHosts : 1048574
NetworkAddress : 165.32.0.0
BroadcastAddress : 165.47.255.255
Hosts : {}[/code:1]
Il y a aussi le paramètre Hosts ; qui, quand spécifié en raison des performances, retourne toutes les adresses IP disponible sur ce réseaux :
[code:1]PS C:\> Get-TMSubnet -NetworkAddress 67.45.23.8/26 -Hosts
IpAddress : 67.45.23.8
SubnetMask : 255.255.255.192
WildcardMask : 0.0.0.63
Mask : 26
NumberOfHosts : 62
NetworkAddress : 67.45.23.0
BroadcastAddress : 67.45.23.63
Hosts : {67.45.23.1, 67.45.23.2, 67.45.23.3, 67.45.23.4...}[/code:1]
Bien Cordialement,
Richard Lazaro.
La pièce jointe Get_TMSubnet.ps1 est absente ou indisponible
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
pour cette exemple :
[code:1]'127.4.0/22' | Get-TMSubnet[/code:1]Tu demandes la saisie du masque alors que l'adresse est erronée.
Idem pour ceux-ci :
[code:1]
\" \" | Get-TMSubnet
'127.4.0' | Get-TMSubnet
[/code:1]
Pour le dernier l'opération réussi, est-ce une erreur ou une conversion implicite admise ?
Le constructeur System.Net.IPAddress prend en compte ce format d'adresse.
Les préfix (TM, RB ) ont-ils une signification ?
La propriété NumberOfHosts ne devrait-elle pas être en 'R/O' :
[code:1]
public Int64 NumberOfHosts {
get { return _Hosts.Count(); }
}
[/code:1]
Richard Lazaro écrit:
Du coup pour ces affectations :Il y a aussi le paramètre Hosts ; qui, quand spécifié en raison des performances, retourne toutes les adresses IP disponible sur ce réseaux :
[code:1]
$ipSplit += ([int]($rtnNetworkAddress.Split('.'))[0])
$ipSplit += ([int]($rtnNetworkAddress.Split('.'))[1])
$ipSplit += ([int]($rtnNetworkAddress.Split('.'))[2])
$ipSplit += ([int]($rtnNetworkAddress.Split('.'))[3])
$rtnHosts.Add(($ipSplit[0].ToString()+\".\"+$ipSplit[1].ToString()+\".\"+$ipSplit[2].ToString()+\".\"+$ipSplit[3].ToString()))
[/code:1]
tu peux simplifier en :
[code:1]
$rtnNetworkAddress='67.45.23.0'
[int[]]$ipSplit=$rtnNetworkAddress.Split('.')
$ofs=\".\"
$rtnHosts.Add(\"$ipSplit\"«»)
[/code:1]
Je n'ai pas vérifié dans le détails, mais si on demande une étendue importante, je pense que cela réduit la sollicitation du Garbage Collector.
Tu divises par 4*2 le nombre de création de tableau.
Juste pour rigoler ( après 30 mn tout de même
[code:1]
$res='127.4.0' | Get-TMSubnet -hosts
Mask: 1
Une exception de type 'System.OutOfMemoryException' a été levée.
Au niveau de ligne : 166 Caractère : 87
+ $rtnHosts.Add(($ipSplit[0].ToString()+\".\"+$ipSplit[1].ToString <<<< ()+\".\"+$ipSplit[2].ToString()+\".\"+$ipSplit[3].ToString()))
+ CategoryInfo : InvalidOperation: (:«») [], RuntimeException
+ FullyQualifiedErrorId : MethodInvocationException
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Richard Lazaro
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
- Messages : 530
- Remerciements reçus 0
J'ai codé ça en grappillant dans de vieux code ... et j'ai pas fait gaffe à mes Split inutile -_-'
Alors, pour le TM et RB ... en fait à la base j'ai fait cela pour un projet (RB) mais je compte le publier plus tard sur mon blog quand il sera ouvert (Think-MS) d'où le TM; donc j'ai du en oublier lors de la conversion ... désolé.
Pour moi, il est très important de mettre des préfixes, travaillant énormément avec les modules, j'ai déjà vu des Cmdlets qui avaient le même nom ...
Par exemple avec le module PsHyperV et le Snapin VmWare qui renseignent une cmdlet du nom de Get-Vm ...
Sinon, J'utilise la classe .Net pour la vérification du format d'Ip ça doit être pour cela que '127.4.0' est admise. Je remarque que je n'ai pas testé toute les possibilités de Mme Michu :]
Je vais améliorer le tout (dès ce soir je pense) et vous proposer quelque chose de mieux.
Merci bien pour ton coup d'œil Laurent.
(Bon sinon, tu en penses quoi du script ?
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Connexion ou Créer un compte pour participer à la conversation.
- Richard Lazaro
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
- Messages : 530
- Remerciements reçus 0
Mais je ne suis pas d'accord avec toi avec ta déclaration.
En faisant ta méthode, si on ne demande pas les hosts il ne sera pas possible d'avoir le nombre d'hosts du réseaux. Ce qui est dommage, car c'est un calcul basique.
(Je suis en train de travailler dessus ^^)
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Connexion ou Créer un compte pour participer à la conversation.
- Richard Lazaro
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
- Messages : 530
- Remerciements reçus 0
Dans un sens, retourner 2 milliards d'adresse (mask 1) ... c'est normal que cela prenne du temps Oo
Sinon, voici la version 1.4 :
- Amélioration des performances;
- Propriété en lecture seule;
- Meilleure gestion des erreurs de Mme Michu;
- Prise en compte des abréviations d'adressage IP (172.4.0 pour 172.4.0.0 par exemple)
Bien Cordialement,
Richard Lazaro.
La pièce jointe Get_TMSubnet-bc6bbf24cd57cd1c8bbdc5878f2219d3.ps1 est absente ou indisponible
Think-MS : (Get-Life).Days | %{ Learn-More }
\\"Problems cannot be solved by the same level of thinking that created them.\\" - Albert Einstein
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Import-Module permet de le faire automatiquement via -Prefix.Pour moi, il est très important de mettre des préfixes, travaillant énormément avec les modules, j'ai déjà vu des Cmdlets qui avaient le même nom ...
Richard Lazaro écrit:
Je serais tenté de dire que c'est surtout celles-ci qu'il faut tester.Je remarque que je n'ai pas testé toute les possibilités de Mme Michu :]
Richard Lazaro écrit:
Qu'il sera très utile pour les admins, bilbao avait déjà proposé ceci .Bon sinon, tu en penses quoi du script ?
Du coup il y a peut être redondance.
Le couplage C#-PS est judicieux pour la déclaration de classe, comme je m'efforce de tout faire en natif je vais peut être succomber à cet usage
Mais cela limite le script à PS v2
Ensuite je trouve sa rédaction lisible et bien structuré, c'est appréciable.
Reste un point que je n'ai pas mentionné, la présence du Read-Host est à reconsidérer dans un contexte d'automatisation.
Mieux vaut un contrat clairement défini, \"J'ai impérativement besoin de telle information pour fonctionner.\"
Les attributs permettent une programmation par contrat (pré-condition seulement), enfin je les considére de la sorte, même s'ils ne sont pas aussi riche que sous le Fx 4.0.
Richard Lazaro écrit:
Effectivement, je n'avais pas poussé plus loin ma réflexion.En faisant ta méthode, si on ne demande pas les hosts il ne sera pas possible d'avoir le nombre d'hosts du réseaux.
Richard Lazaro écrit:
Je plaisantais.Dans un sens, retourner 2 milliards d'adresse (mask 1) ... c'est normal que cela prenne du temps Oo
Richard Lazaro écrit:
Non, mais c'est un bon sujet d'étude pour de l'optimisation de code sous PS, enfin si on a le temps.mais je pense que ça viens d'une limitation de mon algo.
On peut par exemple retarder la conversion de l'adresse IP, peut être la coder sur un int32 en C# ?
Ensuite coder qqc comme un ConvertTo-String ou une interface de formatage spécifique.
Mais bon, c'est du luxe...
ps
Pour la variable $OFS j'ai un doute sur sa portée globale ou locale à la fonction ou au pipe ?
De renommer la propriété Hosts ou de lui coller un alias permettrait de lier la sortie de ta fonction à Test-Connection. Voir ce post , si ce n'est pas déjà fait.<br><br>Message édité par: Laurent Dardenne, à: 21/07/10 19:08
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Contributions à la communauté
- Fonction d'adressage IP