La boîte à Tutoriels de Christopher PECAUD

Top
REALISATION D'UN SCANNER D'ADRESSES IP AVEC C#
Laisser un commentaire

SOMMAIRE

I Introduction
II Conception du scanner d'adresses IP
1. PREREQUIS
2. MISE EN PLACE D'UNE PLAGE D'ADRESSES IP
3. MISE EN PLACE DU SCANNER
4. SCAN DE LA PLAGE D'ADRESSES
III CONCLUSION

I Introduction

Dans ce tutoriel nous allons voir comment réaliser un scanner d'adresses IP réseau. Nous allons retrouver tous les noms d'hôtes qui appartiennent à une plage d'adresse IP. Nous allons utiliser les espaces de noms System.Net, et System.Net.Socket pour arriver à nos fins en ce qui concerne l'élaboration de notre scanner d'adresses IP.

II Conception du scanner d'adresses IP

1. Prérequis

Dans un premier temps nous allons créer un projet de type Windows Form en C# que vous appellerez comme bon vous semble. Pour pouvoir utiliser les espaces de noms System.Net et System.Net.Socket. Il vous faut ajouter les références au projet par l'intermédiaire du gestionnaire de projet. Il suffit d'effectuer un clic droit sur le noeud « références », et en choisissant l'option « Ajouter une référence ». Dans la liste il faut ensuite repérer les deux espaces de noms et ensuite valider la sélection. Dans votre code il suffit d'ajouter les espaces de noms comme ceci :

using System.Net;
using System.Net.Sockets;

2. MISE EN PLACE D'UNE PLAGE D'ADRESSES IP

Pour effectuer cette opération nous créons deux variables ipStart et ipStop :

public string ipStart = "192.168.1.0";
public string ipStop = "192.168.1.255";

Dans notre exemple nous allons scanner la plage d'adresse IP allant de 192.168.1.1 à 192.168.1.255. Une variable ipAdress nous permettra de définir l'adresse en cours de traitement...

public string ipAddress;

3. MISE EN PLACE DU SCANNER

Lensuite lancer une boucle. Voici les lignes de codes permettant de réaliser cette opération :

int lastF = ipStart.LastIndexOf(".");
int lastT = ipStop.LastIndexOf(".");
string frm = ipStart.Substring(lastF + 1);
string tto = ipStop.Substring(lastT + 1);
System.Diagnostics.Debug.WriteLine(frm + " "+ tto);

Comme vous pouvez le constatez il suffit de rechercher le dernier point dans l'adresse IP, ce qui va nous permettre d'obtenir la position de ce caractère dans la chaîne de caractères. Ceci se fait par l'intermédiaire de la fonction LastIndexOf. Il suffit ensuite de récupérer les derniers caractères de cette chaînes qui vont nous permettre d'obtenir dans notre cas les chaînes de caractères « 1 » et « 255 ». Ceci est réalisé par la fonction Substring. Maintenant que nous avons obtenu l'index de début et l'index de fin nous pouvons commencer à exploiter notre scanner.

4. SCAN DE LA PLAGE D'ADRESSES IP

Pour réaliser cette opération nous allons utiliser un objet BackgroundWorker qui nous permet d'effectuer un travail en tâche de fond. C'est-à-dire que nous allons l'utiliser pour le scan des adresses IP et pour voir si un hôte répond à notre demande d'identification. Dans notre boucle nous allons créer une instance de cet objet. Nous avons besoin de même d'appeler les gestionnaire d'événements DoWork() et RunWorkerCompleted.(). Ils se produisent lorsque RunWorkerAsync est appelé dans le premier cas, et lorsque une opération d'arrière plan est terminée. Nous avons besoin d'appeler la fonction Dispose lorsque nous avons terminé chaque opération en arrière plan. Voici notre boucle permettant de gérer notre scan :

for (int i = int.Parse(frm); i < int.Parse(tto); i++)
{
   try
   {
      string IpAddress = ipStart.Substring(0, lastF + 1) + i;
      System.Diagnostics.Debug.WriteLine(ipStart.Substring(0, lastT + 1) + i);
      var DnsWorker = new BackgroundWorker();
      DnsWorker.DoWork += DnsWorker_DoWork; 
      DnsWorker.RunWorkerCompleted += DnsWorker_RunWorkerCompleted;
      DnsWorker.RunWorkerAsync(IpAddress);
      DnsWorker.Dispose();
  }
 catch (SocketException exc)
 {
     Console.WriteLine("Aucun hôte n'a pu être trouvé à cette adresse là..." + exc.ToString());
     continue;
 }
}

 Bien entendu nous mettons en place une gestion des exceptions de type SocketException au cas où à une adresse IP donnée nous ne trouvons aucun hôte. Nous allons maintenant détailler les trois gestionnaires d'événement. Le plus important est DoWork() qui nous permet d'effectuer notre opération en tâche de fond. Ce travail est extrêmement coûteux en temps c'est pour cette raison qu'il faut utiliser une fonction asynchrone. C'est dans cette optique que nous nous appuierons sur la fonction GetHostEntry de l'objet Dns. Auparavant on aura initialiser une instance de la classe IPHostEntry qui permet d'obtenir des informations sur l'adresse IP scannée. En utilisant la propriété AdressList nous tentons de récupérer une liste d'adresse IP sur l'hôte scanné. Voilà notre gestionnaire d'événements :

private void DnsWorker_DoWork(object sender, DoWorkEventArgs e)
{
  var host = new IPHostEntry { AddressList = new[] { IPAddress.Parse((string)e.Argument) }};
  try
  {
    ipAddress = (string)e.Argument;
    var result = Dns.GetHostEntry(host.AddressList[0]);
    e.Result = result.HostName;
  }
  catch (SocketException exc)
  {
    Console.WriteLine(exc.ToString() + " : " + e.Result);
  }
}

Comme vous pouvez le constater nous nous appuyons sur l'adresse IP que nous avons envoyé en argument de RunWorkerAsync. Nous englobons tout le code recherche dans un gestionnaire d'exception de type SocketException de sorte que le programme ne s'arrête pas si un problème de détection survient. Passons maintenant au gestionnaire d'événement RunWorkerCompleted(). Celui-ci est utilisé ici pour ajouter le nom de l'hôte à un objet de type ComboBox. Ce gestionnaire est à utiliser une fois qu'une opération en tâche de fond est terminée. Elle permet donc de mettre à jour des éléments de l'interface graphique par exemple, comme c'est le cas ici.

private void DnsWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  try
  {
     cbxHostName.Items.Add(e.Result);
     gbxHostInfo.Text = "Informations sur l'adresse scannée : " + e.Result;
  }
  catch (ArgumentNullException exc)
  {
  }
}

Nous englobons ce code dans un gestionnaire d'exceptions de type ArgumentNullException.

IV Conclusion

Nous venons de voir un moyen simple et efficace de mettre en place un scanner d'adresses IP permettant de lister tous les hôtes disponible sur un réseau. Ce tutoriel est un point de départ qui vous permettra ensuite d'obtenir des informations intéressantes sur les hôtes en utilisant une nouvelle fois des requêtes wmi, ou snmp. Nous verrons dans un prochain tutoriel comment récupérer des informations sur les postes de travail à partir de ce scan...