Windows Management Instrumentation verkennen in C #

In dit artikel zal ik een glimp opvangen van WMI-technologie en hoe u met WMI kunt werken met behulp van de WMI Query Language in C #. Ik zal dan een scenario bespreken waarin u WMI in de echte wereld kunt gebruiken.

Wat is WMI?

WMI is het acroniem voor Windows Management Instrumentation, een op COM gebaseerde Microsoft-technologie die wordt gebruikt om systeemgerelateerde informatie op te halen. U kunt deze technologie gebruiken om de CPU-ID, MAC-ID enz. Van uw systeem op te halen. Het bestaat uit een verzameling typen die fungeren als een wrapper rond de oorspronkelijke typen om hardwaregerelateerde informatie op te halen. WMI maakt communicatie op laag niveau met het hostbesturingssysteem mogelijk. U kunt WMI gebruiken om met prestatiemeteritems te werken of hardwaregegevens van een systeem op te halen.

U kunt WMI gebruiken om metadata-informatie van uw systeemhardware op te halen, zoals het volgende:

  1. Serienummer van de harde schijf
  2. HDD-formaten
  3. Vrije ruimte op de harde schijf
  4. CPU-serienummer
  5. CPU-kloksnelheid
  6. Type CPU-aansluiting
  7. MAC-adres netwerkadapter
  8. Netwerkadapter Standaardgateway

We hebben genoeg van theoretische informatie - laten we nu wat code verdiepen.

WMI programmeren in C #

Het volgende codefragment gebruikt WQL-query om een ​​lijst te vullen met de namen van logische schijven in uw systeem. Een typische WMI-query ziet er als volgt uit:

Select * FROM Win32_Processor

Zoals u kunt zien in het codefragment, wordt de SelectQuery-klasse gebruikt om een ​​WQL-query te formuleren.

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;

    }

Merk op dat u de System.Management-naamruimte (beschikbaar als onderdeel van System.Management.dll) in uw project moet opnemen. De WMI-klassen die deel uitmaken van deze naamruimte, zijn onder meer:

  1. Win32_LogicalDisk - deze klasse vertegenwoordigt een gegevensbron die overeenkomt met het opslagapparaat in uw systeem. U kunt deze klasse gebruiken om het serienummer, de beschikbare vrije ruimte en de oorspronkelijke grootte van de harde schijf op te halen.
  2. Win32_NetworkAdapterConfiguration - deze klasse vertegenwoordigt de kenmerken van een netwerkadapter in uw systeem. U kunt deze klasse gebruiken om het MAC-adres, de IP-status of de standaard IP-gatewayinformatie op te halen.
  3. Win32_Processor - deze klasse vertegenwoordigt de processor die wordt uitgevoerd op een systeem waarop het Windows-besturingssysteem is geïnstalleerd. U kunt deze klasse gebruiken om de CPU-id, CPU-status, kloksnelheid van de CPU, enz. Van de processors in uw systeem op te halen.

Om de metadata-informatie van de vaste schijven in uw systeem te verkrijgen, dwz de naam, vrije ruimte, schijfgrootte, enz., Kunt u de volgende code gebruiken.

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("---------------------------------------------------");

            }

        }

Het volgende codefragment illustreert hoe u het volumeserienummer van de harde schijven in uw systeem kunt achterhalen.

static string GetHardDiskSerialNumber(string drive = "C")

        {

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

            managementObject.Get();

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

        }

Om de processorId van de processor in uw systeem te verkrijgen, moet u de "ProcessorId" specificeren in de eigenschappenmatrix van de ManagementObject-klasse-instantie, zoals weergegeven in het volgende codefragment.

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

Om de kloksnelheid van de processor in uw systeem te verkrijgen, moet u de "CurrentClockSpeed" specificeren in de eigenschappenmatrix van de ManagementObject-klasse-instantie, zoals weergegeven in het codefragment dat volgt.

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

Nu we het programmeren van WMI met C # hebben onderzocht, wil ik u een praktisch voorbeeld geven waarin u WMI kunt gebruiken. Ik heb in een paar van mijn projecten daadwerkelijk gebruik gemaakt van WMI om knooppuntvergrendeling te implementeren - een functie die voorkomt dat een toepassing naar een ander systeem wordt gekopieerd en erop wordt uitgevoerd.

Knooppuntvergrendeling

Laat me uitleggen wat ik heb gedaan om knooppuntvergrendeling te implementeren en waarom dit nodig was. Knooppuntvergrendeling impliceert het vergrendelen van een knooppunt - een knooppunt is slechts een systeem. In wezen voorkomt dit concept dat een uitvoerbaar bestand dat door uw toepassing wordt gegenereerd, op meerdere systemen wordt geïnstalleerd en uitgevoerd. Ik heb WMI gebruikt om de hardwaregegevens op te halen van het systeem waarop de applicatie moet worden geïnstalleerd en uitgevoerd. Vervolgens werden deze gegevens versleuteld met behulp van een versleutelingsalgoritme en vervolgens werd een unieke activeringscode gegenereerd voor dat systeem. Deze code zal dan gebruikt moeten worden om de applicatie te activeren. Merk op dat de knooppunt-ID of de activeringscode uniek is omdat ze bestaan ​​uit een combinatie van de CPU-ID en MAC-ID van het systeem waarop de applicatie moest worden geïnstalleerd en uitgevoerd.