Question IpAddress : "IsInSameSubnet" (code C# / PoSh)
- SiSMik
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 492
- Remerciements reçus 0
il y a 13 ans 5 mois #12738
par SiSMik
Réponse de SiSMik sur le sujet Re:IsInSameSubnet
Matthew BETTON écrit:
ça m'a donné une idée de module, je vais approfondir un peu le truc et tester le tutoriel de Laurent par la même occasion
P.S. : Tu devrais peut être poster les codes dans le Forum Contributions.
ça m'a donné une idée de module, je vais approfondir un peu le truc et tester le tutoriel de Laurent par la même occasion
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 968
- Remerciements reçus 0
il y a 13 ans 5 mois #12741
par Matthew BETTON
Réponse de Matthew BETTON sur le sujet Re:IsInSameSubnet
Salut,
Ce n'est pas terminé... Je reviens donc à la charge, pour comprendre !
Au chargement du code C#, j'ai des erreurs de compilation :
[code:1]Add-Type : c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(7) : Impossible de définir une nouvelle méthode d'extension, car le type de compilateur requis 'System.Runtime.CompilerServices.ExtensionAttri
bute' est introuvable. Une référence à System.Core.dll est-elle manquante ?
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(6) : {
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(7) : >>> public static IPAddress GetBroadcastAddress(this IPAddress address, IPAddress subnetMask)
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(8) : {
Au niveau de C:\Users\Matthew\AppData\Local\Temp\e8358e5d-d217-41bd-bfff-3d4836d6090f.ps1 : 50 Caractère : 9
+ Add-Type <<<< $Class
+ CategoryInfo : InvalidData: (c:\Users\Matthe...lle manquante ?:CompilerError) [Add-Type], Exception
+ FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(23) : Impossible de définir une nouvelle méthode d'extension, car le type de compilateur requis 'System.Runtime.CompilerServices.ExtensionAttr
ibute' est introuvable. Une référence à System.Core.dll est-elle manquante ?
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(22) :
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(23) : >>> public static IPAddress GetNetworkAddress(this IPAddress address, IPAddress subnetMask)
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(24) : {
Au niveau de C:\Users\Matthew\AppData\Local\Temp\e8358e5d-d217-41bd-bfff-3d4836d6090f.ps1 : 50 Caractère : 9
+ Add-Type <<<< $Class
+ CategoryInfo : InvalidData: (c:\Users\Matthe...lle manquante ?:CompilerError) [Add-Type], Exception
+ FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(39) : Impossible de définir une nouvelle méthode d'extension, car le type de compilateur requis 'System.Runtime.CompilerServices.ExtensionAttr
ibute' est introuvable. Une référence à System.Core.dll est-elle manquante ?
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(38) :
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(39) : >>> public static bool IsInSameSubnet(this IPAddress address2, IPAddress address, IPAddress subnetMask)
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(40) : {
Au niveau de C:\Users\Matthew\AppData\Local\Temp\e8358e5d-d217-41bd-bfff-3d4836d6090f.ps1 : 50 Caractère : 9
+ Add-Type <<<< $Class
+ CategoryInfo : InvalidData: (c:\Users\Matthe...lle manquante ?:CompilerError) [Add-Type], Exception
+ FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : Impossible d'ajouter un type. Des erreurs de compilation se sont produites.
Au niveau de C:\Users\Matthew\AppData\Local\Temp\e8358e5d-d217-41bd-bfff-3d4836d6090f.ps1 : 50 Caractère : 9
+ Add-Type <<<< $Class
+ CategoryInfo : InvalidData: (:«») [Add-Type], InvalidOperationException
+ FullyQualifiedErrorId : COMPILER_ERRORS,Microsoft.PowerShell.Commands.AddTypeCommand
[/code:1]
N.B. : Je suis en PoSh Version 2 ...
Je pense très justement que le souci vient de là :
[code:1]Add-Type : c:\Users\Matthew\AppData\Local\Temp\01z2chww.0.cs(8) : Impossible de définir une nouvelle méthode d'extension, car le type de compilateur requis 'System.Runtime.CompilerServices.ExtensionAttri
bute' est introuvable. Une référence à System.Core.dll est-elle manquante ?
[/code:1]
Justement, dans le code C# fourni ici , il s'agit bien d'une méthode de 'System.Net.IpAddress' :
[code:1]bool inSameNet = ip1.IsInSameSubnet(ip2, mask);[/code:1]
Mais quand tu le fais dans PowerShell, dans ton exemple, tu appelles un raccourci, donc tu pointes sur une Classe :
[code:1][IPAddressExtensions]::IsInSameSubnet($ip1,$ip2,$mask)[/code:1]
Il y a donc des choses qui m'échappent et j'aimerais donc comprendre le fin mot de l'histoire ....

Message édité par: Matthew BETTON, à: 23/09/12 10:12<br><br>Message édité par: Matthew BETTON, à: 23/09/12 10:24
Ce n'est pas terminé... Je reviens donc à la charge, pour comprendre !
Au chargement du code C#, j'ai des erreurs de compilation :
[code:1]Add-Type : c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(7) : Impossible de définir une nouvelle méthode d'extension, car le type de compilateur requis 'System.Runtime.CompilerServices.ExtensionAttri
bute' est introuvable. Une référence à System.Core.dll est-elle manquante ?
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(6) : {
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(7) : >>> public static IPAddress GetBroadcastAddress(this IPAddress address, IPAddress subnetMask)
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(8) : {
Au niveau de C:\Users\Matthew\AppData\Local\Temp\e8358e5d-d217-41bd-bfff-3d4836d6090f.ps1 : 50 Caractère : 9
+ Add-Type <<<< $Class
+ CategoryInfo : InvalidData: (c:\Users\Matthe...lle manquante ?:CompilerError) [Add-Type], Exception
+ FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(23) : Impossible de définir une nouvelle méthode d'extension, car le type de compilateur requis 'System.Runtime.CompilerServices.ExtensionAttr
ibute' est introuvable. Une référence à System.Core.dll est-elle manquante ?
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(22) :
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(23) : >>> public static IPAddress GetNetworkAddress(this IPAddress address, IPAddress subnetMask)
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(24) : {
Au niveau de C:\Users\Matthew\AppData\Local\Temp\e8358e5d-d217-41bd-bfff-3d4836d6090f.ps1 : 50 Caractère : 9
+ Add-Type <<<< $Class
+ CategoryInfo : InvalidData: (c:\Users\Matthe...lle manquante ?:CompilerError) [Add-Type], Exception
+ FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(39) : Impossible de définir une nouvelle méthode d'extension, car le type de compilateur requis 'System.Runtime.CompilerServices.ExtensionAttr
ibute' est introuvable. Une référence à System.Core.dll est-elle manquante ?
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(38) :
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(39) : >>> public static bool IsInSameSubnet(this IPAddress address2, IPAddress address, IPAddress subnetMask)
c:\Users\Matthew\AppData\Local\Temp\ejmjrg3h.0.cs(40) : {
Au niveau de C:\Users\Matthew\AppData\Local\Temp\e8358e5d-d217-41bd-bfff-3d4836d6090f.ps1 : 50 Caractère : 9
+ Add-Type <<<< $Class
+ CategoryInfo : InvalidData: (c:\Users\Matthe...lle manquante ?:CompilerError) [Add-Type], Exception
+ FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : Impossible d'ajouter un type. Des erreurs de compilation se sont produites.
Au niveau de C:\Users\Matthew\AppData\Local\Temp\e8358e5d-d217-41bd-bfff-3d4836d6090f.ps1 : 50 Caractère : 9
+ Add-Type <<<< $Class
+ CategoryInfo : InvalidData: (:«») [Add-Type], InvalidOperationException
+ FullyQualifiedErrorId : COMPILER_ERRORS,Microsoft.PowerShell.Commands.AddTypeCommand
[/code:1]
N.B. : Je suis en PoSh Version 2 ...
Je pense très justement que le souci vient de là :
[code:1]Add-Type : c:\Users\Matthew\AppData\Local\Temp\01z2chww.0.cs(8) : Impossible de définir une nouvelle méthode d'extension, car le type de compilateur requis 'System.Runtime.CompilerServices.ExtensionAttri
bute' est introuvable. Une référence à System.Core.dll est-elle manquante ?
[/code:1]
Justement, dans le code C# fourni ici , il s'agit bien d'une méthode de 'System.Net.IpAddress' :
[code:1]bool inSameNet = ip1.IsInSameSubnet(ip2, mask);[/code:1]
Mais quand tu le fais dans PowerShell, dans ton exemple, tu appelles un raccourci, donc tu pointes sur une Classe :
[code:1][IPAddressExtensions]::IsInSameSubnet($ip1,$ip2,$mask)[/code:1]
Il y a donc des choses qui m'échappent et j'aimerais donc comprendre le fin mot de l'histoire ....
Message édité par: Matthew BETTON, à: 23/09/12 10:12<br><br>Message édité par: Matthew BETTON, à: 23/09/12 10:24
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 968
- Remerciements reçus 0
il y a 13 ans 5 mois #12744
par Matthew BETTON
Réponse de Matthew BETTON sur le sujet Re:IsInSameSubnet
J'ai fini par faire fonctionner le code en ajoutant cette partie :
[code:1]namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
[/code:1]
Ici :
[code:1]$Class = @'
using System;
using System.Collections;
using System.Net;
namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
}[/code:1]
A priori, c'est un problème connu :
stackoverflow.com/questions/205644/error...n-methods-in-c-sharp
kohari.org/2008/04/04/extension-methods-in-net-20/
@ +
Matthew
[code:1]namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
}
[/code:1]
Ici :
[code:1]$Class = @'
using System;
using System.Collections;
using System.Net;
namespace System.Runtime.CompilerServices
{
public class ExtensionAttribute : Attribute { }
}[/code:1]
A priori, c'est un problème connu :
stackoverflow.com/questions/205644/error...n-methods-in-c-sharp
kohari.org/2008/04/04/extension-methods-in-net-20/
@ +
Matthew
Connexion ou Créer un compte pour participer à la conversation.
- SiSMik
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 492
- Remerciements reçus 0
il y a 13 ans 5 mois #12746
par SiSMik
Réponse de SiSMik sur le sujet Re:IsInSameSubnet
Oui a priori cela vient de la version du .NET Framework installée sur le pc.
J'ai le .Net 4 avec Windows 8 et Posh v3 depuis quelques jours (j'aurais du préciser)
J'ai le .Net 4 avec Windows 8 et Posh v3 depuis quelques jours (j'aurais du préciser)
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 13 ans 5 mois #12750
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:IsInSameSubnet
Salut,
bon, j'arrive après la bataille, mais avec qq munitions
Matthew BETTON écrit:
[code:1]
$Class = @'
using System;
using System.Collections;
using System.Net;
namespace PowerShellScripting{
public static class IPAddressExtensions
{
public static IPAddress GetBroadcastAddress(this IPAddress address, IPAddress subnetMask)
{
byte[] ipAdressBytes = address.GetAddressBytes();
byte[] subnetMaskBytes = subnetMask.GetAddressBytes();
if (ipAdressBytes.Length != subnetMaskBytes.Length)
throw new ArgumentException(\"Lengths of IP address and subnet mask do not match.\"«»);
byte[] broadcastAddress = new byte[ipAdressBytes.Length];
for (int i = 0; i < broadcastAddress.Length; i++)
{
broadcastAddress = (byte)(ipAdressBytes | (subnetMaskBytes ^ 255));
}
return new IPAddress(broadcastAddress);
}
public static IPAddress GetNetworkAddress(this IPAddress address, IPAddress subnetMask)
{
byte[] ipAdressBytes = address.GetAddressBytes();
byte[] subnetMaskBytes = subnetMask.GetAddressBytes();
if (ipAdressBytes.Length != subnetMaskBytes.Length)
throw new ArgumentException(\"Lengths of IP address and subnet mask do not match.\"«»);
byte[] broadcastAddress = new byte[ipAdressBytes.Length];
for (int i = 0; i < broadcastAddress.Length; i++)
{
broadcastAddress = (byte)(ipAdressBytes & (subnetMaskBytes));
}
return new IPAddress(broadcastAddress);
}
public static bool IsInSameSubnet(this IPAddress address2, IPAddress address, IPAddress
subnetMask)
{
IPAddress network1 = address.GetNetworkAddress(subnetMask);
IPAddress network2 = address2.GetNetworkAddress(subnetMask);
return network1.Equals(network2);
}
}
}
'@
[/code:1]
Il faut spécifier le langage, c'est pour ça que Benduru ne rencontre pas de pb avec la v3 (Add-Type supporte peut-être d'autres versions) :
[code:1]
Add-Type -TypeDefinition $Class -Language CSharpVersion3
function Get-CurrentDomain{[AppDomain]::CurrentDomain}
function Get-Assemblies{(Get-CurrentDomain).GetAssemblies()}
$a=Get-Assemblies|Where {$_.Location -eq [String]::Empty}
$a.GetTypes()
[/code:1]
Matthew BETTON écrit:
Traitement déjà réalisé ici .
Allez, c'est parti !
[code:1]
#Ouvrir nouvelle console PS, sinon le type existerait déjà dans le domaine d'application
#ATTENTION a redéclarer la variable $Class
Set-Location C:\Temp
Add-Type -TypeDefinition $Class -Language CSharpVersion3 -OutputType Library -OutputAssembly IPAddressExtensions.dll
Dir *.dll
Import-Module ExtensionMethod
$TypesFileName=\"C:\Temp\IpAddress.Types.ps1xml\"
Add-Type -Path \"C:\temp\IPAddressExtensions.dll\" -Pass|
Find-ExtensionMethod -ExcludeGeneric|
Get-ExtensionMethodInfo -ExcludeGeneric -ExcludeInterface|
New-HashTable -key \"Key\" -Value \"Value\" -MakeArray|
#Crée un texte représentant une structure XML que
# l'on insére dans un fichier de type PowerShell.
New-ExtensionMethodTypeData > $TypesFileName
Type $TypesFileName|More
#Met à jour la configuration de type étendu (ETS)
Update-TypeData $TypesFileName
#Note: je crois que la v3 propose de créer des fichiers de type à la volée, à voir
[/code:1]
Une fois ceci fait, les méthodes d'extension sont accessibles directement sur les instances du type ciblé :
[code:1]
[ipAddress]$Adr=\"192.1.1.2\"
$Adr.GetBroadcastAddress('192.1.10.25')
[/code:1]
Il restera à charger dans le profile ou au cas par cas, le fichier de type généré.
bon, j'arrive après la bataille, mais avec qq munitions
Matthew BETTON écrit:
Je pense qu'on peut simplifier, je reprend la définition du code en y ajoutant une déclaration d'espace de nom :J'ai fini par faire fonctionner le code en ajoutant cette partie :
[code:1]
$Class = @'
using System;
using System.Collections;
using System.Net;
namespace PowerShellScripting{
public static class IPAddressExtensions
{
public static IPAddress GetBroadcastAddress(this IPAddress address, IPAddress subnetMask)
{
byte[] ipAdressBytes = address.GetAddressBytes();
byte[] subnetMaskBytes = subnetMask.GetAddressBytes();
if (ipAdressBytes.Length != subnetMaskBytes.Length)
throw new ArgumentException(\"Lengths of IP address and subnet mask do not match.\"«»);
byte[] broadcastAddress = new byte[ipAdressBytes.Length];
for (int i = 0; i < broadcastAddress.Length; i++)
{
broadcastAddress = (byte)(ipAdressBytes | (subnetMaskBytes ^ 255));
}
return new IPAddress(broadcastAddress);
}
public static IPAddress GetNetworkAddress(this IPAddress address, IPAddress subnetMask)
{
byte[] ipAdressBytes = address.GetAddressBytes();
byte[] subnetMaskBytes = subnetMask.GetAddressBytes();
if (ipAdressBytes.Length != subnetMaskBytes.Length)
throw new ArgumentException(\"Lengths of IP address and subnet mask do not match.\"«»);
byte[] broadcastAddress = new byte[ipAdressBytes.Length];
for (int i = 0; i < broadcastAddress.Length; i++)
{
broadcastAddress = (byte)(ipAdressBytes & (subnetMaskBytes));
}
return new IPAddress(broadcastAddress);
}
public static bool IsInSameSubnet(this IPAddress address2, IPAddress address, IPAddress
subnetMask)
{
IPAddress network1 = address.GetNetworkAddress(subnetMask);
IPAddress network2 = address2.GetNetworkAddress(subnetMask);
return network1.Equals(network2);
}
}
}
'@
[/code:1]
Il faut spécifier le langage, c'est pour ça que Benduru ne rencontre pas de pb avec la v3 (Add-Type supporte peut-être d'autres versions) :
[code:1]
Add-Type -TypeDefinition $Class -Language CSharpVersion3
function Get-CurrentDomain{[AppDomain]::CurrentDomain}
function Get-Assemblies{(Get-CurrentDomain).GetAssemblies()}
$a=Get-Assemblies|Where {$_.Location -eq [String]::Empty}
$a.GetTypes()
[/code:1]
Matthew BETTON écrit:
Pour coupler les méthodes d'extension, définies précédement, avec le type IpAddress, il faut générer un fichier de type à partir d'une dll compilée.Mais quand tu le fais dans PowerShell, dans ton exemple, tu appelles un raccourci, donc tu pointes sur une Classe :
Traitement déjà réalisé ici .
Allez, c'est parti !
[code:1]
#Ouvrir nouvelle console PS, sinon le type existerait déjà dans le domaine d'application
#ATTENTION a redéclarer la variable $Class
Set-Location C:\Temp
Add-Type -TypeDefinition $Class -Language CSharpVersion3 -OutputType Library -OutputAssembly IPAddressExtensions.dll
Dir *.dll
Import-Module ExtensionMethod
$TypesFileName=\"C:\Temp\IpAddress.Types.ps1xml\"
Add-Type -Path \"C:\temp\IPAddressExtensions.dll\" -Pass|
Find-ExtensionMethod -ExcludeGeneric|
Get-ExtensionMethodInfo -ExcludeGeneric -ExcludeInterface|
New-HashTable -key \"Key\" -Value \"Value\" -MakeArray|
#Crée un texte représentant une structure XML que
# l'on insére dans un fichier de type PowerShell.
New-ExtensionMethodTypeData > $TypesFileName
Type $TypesFileName|More
#Met à jour la configuration de type étendu (ETS)
Update-TypeData $TypesFileName
#Note: je crois que la v3 propose de créer des fichiers de type à la volée, à voir
[/code:1]
Une fois ceci fait, les méthodes d'extension sont accessibles directement sur les instances du type ciblé :
[code:1]
[ipAddress]$Adr=\"192.1.1.2\"
$Adr.GetBroadcastAddress('192.1.10.25')
[/code:1]
Il restera à charger dans le profile ou au cas par cas, le fichier de type généré.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Matthew BETTON
- Auteur du sujet
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 968
- Remerciements reçus 0
il y a 13 ans 5 mois #12760
par Matthew BETTON
Réponse de Matthew BETTON sur le sujet Re:IsInSameSubnet
WHaHoouuu !
Maintenant je comprends mieux.
Merci Laurent pour avoir éclairé notre lanterne
Maintenant je comprends mieux.
Merci Laurent pour avoir éclairé notre lanterne
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.063 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les initiés
- IpAddress : "IsInSameSubnet" (code C# / PoSh)