Question IpAddress : "IsInSameSubnet" (code C# / PoSh)

Plus d'informations
il y a 13 ans 5 mois #12738 par SiSMik
Réponse de SiSMik sur le sujet Re:IsInSameSubnet
Matthew BETTON écrit:

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 :silly:

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

Plus d'informations
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

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

Plus d'informations
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

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

Plus d'informations
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) ;)

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

Plus d'informations
il y a 13 ans 5 mois #12750 par Laurent Dardenne
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:

J'ai fini par faire fonctionner le code en ajoutant cette partie :

Je pense qu'on peut simplifier, je reprend la définition du code en y ajoutant une déclaration d'espace de nom :
[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(\&quot;Lengths of IP address and subnet mask do not match.\&quot;«»);

byte[] broadcastAddress = new byte[ipAdressBytes.Length];
for (int i = 0; i &lt; 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(\&quot;Lengths of IP address and subnet mask do not match.\&quot;«»);

byte[] broadcastAddress = new byte[ipAdressBytes.Length];
for (int i = 0; i &lt; broadcastAddress.Length; i++)
{
broadcastAddress = (byte)(ipAdressBytes &amp; (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:

Mais quand tu le fais dans PowerShell, dans ton exemple, tu appelles un raccourci, donc tu pointes sur une Classe :

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.
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=\&quot;C:\Temp\IpAddress.Types.ps1xml\&quot;

Add-Type -Path \&quot;C:\temp\IPAddressExtensions.dll\&quot; -Pass|
Find-ExtensionMethod -ExcludeGeneric|
Get-ExtensionMethodInfo -ExcludeGeneric -ExcludeInterface|
New-HashTable -key \&quot;Key\&quot; -Value \&quot;Value\&quot; -MakeArray|
#Crée un texte représentant une structure XML que
# l'on insére dans un fichier de type PowerShell.
New-ExtensionMethodTypeData &gt; $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=\&quot;192.1.1.2\&quot;
$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.

Plus d'informations
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 ;)

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

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