Exploration de l'instrumentation de gestion Windows en C #

Dans cet article, je vais présenter un aperçu de la technologie WMI et comment vous pouvez travailler avec WMI en utilisant le langage de requête WMI en C #. Je discuterai ensuite d'un scénario dans lequel vous pouvez utiliser WMI dans le monde réel.

Qu'est-ce que WMI?

WMI est l'acronyme de Windows Management Instrumentation, une technologie Microsoft basée sur COM utilisée pour récupérer les informations relatives au système. Vous pouvez utiliser cette technologie pour récupérer l'ID CPU, l'ID MAC, etc. de votre système. Il comprend une collection de types qui agissent comme un wrapper autour des types natifs pour récupérer des informations liées au matériel. WMI facilite une communication de bas niveau avec le système d'exploitation hôte. Vous pouvez utiliser WMI pour travailler avec des compteurs de performance ou pour récupérer des informations sur le matériel d'un système.

Vous pouvez utiliser WMI pour récupérer les informations de métadonnées de votre matériel système comme suit:

  1. Numéro de série du disque dur
  2. Tailles de disque dur
  3. Espace libre sur le disque dur
  4. Numéro de série du processeur
  5. Vitesse d'horloge du processeur
  6. Type de socket CPU
  7. Adresse MAC de l'adaptateur réseau
  8. Passerelle par défaut de la carte réseau

Nous en avons assez d'informations théoriques - explorons maintenant du code.

Programmation WMI en C #

L'extrait de code suivant utilise la requête WQL pour remplir une liste avec les noms des disques logiques de votre système. Une requête WMI typique ressemble à ceci:

Select * FROM Win32_Processor

Comme vous pouvez le voir dans l'extrait de code, la classe SelectQuery est utilisée pour formuler une requête WQL.

static List PopulateDisk()

        {

            List disk = new List();

            SelectQuery selectQuery = new SelectQuery("Win32_LogicalDisk");

            ManagementObjectSearcher mnagementObjectSearcher = new ManagementObjectSearcher(selectQuery);

       foreach (ManagementObject managementObject in mnagementObjectSearcher.Get())

            {

           disk.Add(managementObject.ToString());

       }

            return disk;

    }

Notez que vous devez inclure l'espace de noms System.Management (disponible dans le cadre de System.Management.dll) dans votre projet. Les classes WMI incluses dans cet espace de noms sont les suivantes:

  1. Win32_LogicalDisk - cette classe représente une source de données qui correspond au périphérique de stockage de votre système. Vous pouvez utiliser cette classe pour récupérer le numéro de série, l'espace libre disponible et la taille initiale du disque dur.
  2. Win32_NetworkAdapterConfiguration - cette classe représente les attributs d'une carte réseau dans votre système. Vous pouvez utiliser cette classe pour récupérer l'adresse MAC, l'état IP ou les informations de passerelle IP par défaut.
  3. Win32_Processor - cette classe représente le processeur fonctionnant sur un système sur lequel le système d'exploitation Windows est installé. Vous pouvez utiliser cette classe pour récupérer l'ID du processeur, l'état du processeur, la vitesse d'horloge du processeur, etc. des processeurs de votre système.

Pour obtenir les informations de métadonnées des disques fixes de votre système, c'est-à-dire le nom, l'espace libre, la taille du disque, etc., vous pouvez utiliser le code suivant.

static void GetDiskMetadata()

        {

            System.Management.ManagementScope managementScope = new System.Management.ManagementScope();

            System.Management.ObjectQuery objectQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

            ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(managementScope,objectQuery);

            ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get();

            foreach (ManagementObject managementObject in managementObjectCollection)

            {

                Console.WriteLine("Disk Name : " + managementObject["Name"].ToString());

                Console.WriteLine("FreeSpace: " + managementObject["FreeSpace"].ToString());

                Console.WriteLine("Disk Size: " + managementObject["Size"].ToString());

                Console.WriteLine("---------------------------------------------------");

            }

        }

L'extrait de code suivant illustre comment vous pouvez récupérer le numéro de série du volume des disques durs de votre système.

static string GetHardDiskSerialNumber(string drive = "C")

        {

            ManagementObject managementObject = new ManagementObject("Win32_LogicalDisk.DeviceID=\"" + drive + ":\"");

            managementObject.Get();

            return managementObject["VolumeSerialNumber"].ToString();

        }

Pour obtenir le processorId du processeur de votre système, vous devez spécifier le "ProcessorId" dans le tableau de propriétés de l'instance de classe ManagementObject comme indiqué dans l'extrait de code qui suit.

string processorId = managementObject.Properties ["ProcessorId"]. Value.ToString ();

Pour obtenir la vitesse d'horloge du processeur de votre système, vous devez spécifier le "CurrentClockSpeed" dans le tableau des propriétés de l'instance de classe ManagementObject comme indiqué dans l'extrait de code qui suit.

Int32 clockSpeed = Convert.ToInt32(managementObject.Properties["CurrentClockSpeed"].Value.ToString());

Maintenant que nous avons exploré la programmation WMI en utilisant C #, laissez-moi vous donner un exemple pratique où vous pouvez utiliser WMI. J'ai en fait utilisé WMI dans quelques-uns de mes projets pour implémenter le verrouillage des nœuds - une fonctionnalité qui empêche une application de copier dans un autre système et d'être exécutée dessus.

Verrouillage des nœuds

Laissez-moi vous expliquer ce que j'ai fait pour implémenter le verrouillage des nœuds et pourquoi il était nécessaire. Le verrouillage de nœud implique le verrouillage d'un nœud - un nœud n'est qu'un système. En substance, ce concept empêche un exécutable généré par votre application d'être installé et exécuté dans plusieurs systèmes. J'ai utilisé WMI pour récupérer les détails matériels du système sur lequel l'application doit être installée et exécutée. Ensuite, ces détails ont été cryptés à l'aide d'un algorithme de cryptage, puis d'un code d'activation unique généré pour ce système. Ce code devra ensuite être utilisé pour activer l'application. Notez que l'ID de nœud ou le code d'activation est unique car il est composé d'une combinaison de l'ID CPU et de l'ID MAC du système sur lequel l'application devait être installée et exécutée.