Programmering

Udforskning af Windows Management Instrumentation i C #

I denne artikel vil jeg præsentere et glimt af WMI-teknologi, og hvordan du kan arbejde med WMI ved hjælp af WMI Query Language i C #. Jeg vil derefter diskutere et scenarie, hvor du kan bruge WMI til at blive brugt i den virkelige verden.

Hvad er WMI?

WMI er forkortelsen for Windows Management Instrumentation, en COM-baseret Microsoft-teknologi, der bruges til at hente systemrelaterede oplysninger. Du kan bruge denne teknologi til at hente CPU-id, MAC-id osv. På dit system. Det består af en samling typer, der fungerer som en indpakning omkring de indfødte typer for at hente hardware-relateret information. WMI muliggør en kommunikation på lavt niveau med værtsoperativsystemet. Du kan bruge WMI til at arbejde med præstationstællere eller hente hardwareoplysninger fra et system.

Du kan bruge WMI til at hente metadataoplysninger om din systemhardware som følger:

  1. HDD-serienummer
  2. HDD-størrelser
  3. HDD-fri plads
  4. CPU-serienummer
  5. CPU-urets hastighed
  6. CPU-sokkeltype
  7. Netværksadapter MAC-adresse
  8. Netværksadapter Standard Gateway

Vi har fået nok af teoretisk information - lad os nu grave i noget kode.

Programmering af WMI i C #

Følgende kodestykke bruger WQL-forespørgsel til at udfylde en liste med navnene på logiske diske i dit system. En typisk WMI-forespørgsel ser sådan ud:

Vælg * FRA Win32_Processor

Som du kan se i kodestykket, bruges SelectQuery-klassen til at formulere en WQL-forespørgsel.

statisk liste PopulateDisk ()

        {

Liste disk = ny liste ();

SelectQuery selectQuery = ny SelectQuery ("Win32_LogicalDisk");

ManagementObjectSearcher mnagementObjectSearcher = ny ManagementObjectSearcher (selectQuery);

foreach (ManagementObject managementObject in mnagementObjectSearcher.Get ())

            {

disk.Add (managementObject.ToString ());

       }

returnere disk;

    }

Bemærk, at du skal medtage System.Management-navneområdet (tilgængeligt som en del af System.Management.dll) i dit projekt. WMI-klasser inkluderet som en del af dette navneområde inkluderer følgende:

  1. Win32_LogicalDisk - denne klasse repræsenterer en datakilde, der svarer til lagerenheden i dit system. Du kan bruge denne klasse til at hente serienummeret, ledig plads og harddiskens indledende størrelse.
  2. Win32_NetworkAdapterConfiguration - denne klasse repræsenterer attributterne til en netværksadapter i dit system. Du kan bruge denne klasse til at hente MAC-adressen, IP-status eller standard-IP-gatewayoplysningerne.
  3. Win32_Processor - denne klasse repræsenterer processoren, der kører på et system, der har Windows-operativsystem installeret. Du kan bruge denne klasse til at hente CPU-id, CPU-status, CPU-urhastighed osv. For processorer i dit system.

For at få metadataoplysningerne om de faste diske i dit system, dvs. navnet, freespace, diskstørrelse osv., Kan du bruge følgende kode.

statisk ugyldighed GetDiskMetadata ()

        {

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

System.Management.ObjectQuery objectQuery = ny System.Management.ObjectQuery ("vælg FreeSpace, størrelse, navn fra Win32_LogicalDisk hvor DriveType = 3");

ManagementObjectSearcher managementObjectSearcher = ny ManagementObjectSearcher (managementScope, objectQuery);

ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get ();

foreach (ManagementObject managementObject in managementObjectCollection)

            {

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

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

Console.WriteLine ("Diskstørrelse:" + managementObject ["Størrelse"]. ToString ());

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

            }

        }

Følgende kodestykke illustrerer, hvordan du kan hente volumenens serienummer på harddiskene i dit system.

statisk streng GetHardDiskSerialNumber (strengdrev = "C")

        {

ManagementObject managementObject = ny ManagementObject ("Win32_LogicalDisk.DeviceID = \" "+ drev +": \ "");

managementObject.Get ();

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

        }

For at hente processorId for processoren i dit system skal du angive "ProcessorId" i egenskabsarrayet for klasseinstansen ManagementObject som vist i det følgende kodestykke.

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

For at opnå processorens klokkehastighed i dit system skal du specificere "CurrentClockSpeed" i egenskabsarrayet for ManagementObject-klasseinstansen som vist i det følgende kodestykke.

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

Nu hvor vi har undersøgt programmering af WMI ved hjælp af C #, lad mig fortælle dig et praktisk eksempel, hvor du kan bruge WMI til at bruge. Jeg brugte faktisk WMI i nogle få af mine projekter til at implementere knudelåsning - en funktion, der forhindrer, at en applikation kopieres til et andet system og udføres på det.

Knude låsning

Lad mig forklare, hvad jeg gjorde for at implementere nodelåsning, og hvorfor det var nødvendigt. Nodelåsning indebærer at låse en node - en node er bare et system. I det væsentlige forhindrer dette koncept en eksekverbar fil, der genereres af din applikation, fra at blive installeret og udført i flere systemer. Jeg brugte WMI til at hente hardwareoplysningerne i det system, som applikationen skal installeres og udføres på. Dernæst blev disse detaljer krypteret ved hjælp af en krypteringsalgoritme og derefter en unik aktiveringskode, der blev genereret til det system. Denne kode skal derefter bruges til at aktivere applikationen. Bemærk, at node-id'en eller aktiveringskoden er unik, fordi de består af en kombination af CPU-id'en og MAC-id'en til det system, som applikationen skulle installeres og udføres på.