Programmering

Utforske Windows Management Instrumentation i C #

I denne artikkelen vil jeg presentere et glimt av WMI-teknologi og hvordan du kan jobbe med WMI ved hjelp av WMI Query Language i C #. Jeg vil deretter diskutere et scenario der du kan bruke WMI til å brukes i den virkelige verden.

Hva er WMI?

WMI er forkortelsen for Windows Management Instrumentation, en COM-basert Microsoft-teknologi som brukes til å hente systemrelatert informasjon. Du kan bruke denne teknologien til å hente CPU-ID, MAC ID, etc. til systemet ditt. Den består av en samling typer som fungerer som en innpakning rundt de innfødte typene for å hente ut maskinvarerelatert informasjon. WMI muliggjør en kommunikasjon på lavt nivå med vertsoperativsystemet. Du kan bruke WMI til å jobbe med ytelsestellere eller hente maskinvareinformasjon fra et system.

Du kan bruke WMI til å hente metadatainformasjon om systemmaskinvaren din slik:

  1. HDD-serienummer
  2. HDD-størrelser
  3. HDD ledig plass
  4. CPU-serienummer
  5. CPU klokkehastighet
  6. CPU-kontakttype
  7. Nettverksadapter MAC-adresse
  8. Nettverksadapter standard gateway

Vi har fått nok av teoretisk informasjon - la oss nå grave i litt kode.

Programmering av WMI i C #

Følgende kodebit bruker WQL-spørring for å fylle ut en liste med navnene på logiske disker i systemet ditt. Et typisk WMI-spørsmål ser slik ut:

Velg * FRA Win32_Processor

Som du kan se i kodebiten, brukes SelectQuery-klassen til å formulere et WQL-spørsmål.

statisk liste PopulateDisk ()

        {

Listdisk = ny liste ();

SelectQuery selectQuery = ny SelectQuery ("Win32_LogicalDisk");

ManagementObjectSearcher mnagementObjectSearcher = ny ManagementObjectSearcher (selectQuery);

foreach (ManagementObject managementObject in mnagementObjectSearcher.Get ())

            {

disk.Add (managementObject.ToString ());

       }

retur disk;

    }

Merk at du bør inkludere navneområdet System.Management (tilgjengelig som en del av System.Management.dll) i prosjektet. WMI-klassene som inngår som en del av dette navneområdet inkluderer følgende:

  1. Win32_LogicalDisk - denne klassen representerer en datakilde som tilsvarer lagringsenheten i systemet ditt. Du kan bruke denne klassen til å hente serienummeret, ledig ledig plass og innledende størrelse på harddisken.
  2. Win32_NetworkAdapterConfiguration - denne klassen representerer attributtene til et nettverkskort i systemet ditt. Du kan bruke denne klassen til å hente MAC-adressen, IP-statusen eller standard IP-gatewayinformasjonen.
  3. Win32_Processor - denne klassen representerer prosessoren som kjører på et system som har Windows-operativsystem installert. Du kan bruke denne klassen til å hente CPU-ID, CPU-status, CPU-klokkehastighet, etc. til prosessorene i systemet ditt.

For å få metadatainformasjonen til de faste diskene i systemet ditt, dvs. navnet, freespace, diskstørrelse, etc., kan du bruke følgende kode.

statisk tomrom GetDiskMetadata ()

        {

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

System.Management.ObjectQuery objectQuery = ny System.Management.ObjectQuery ("velg FreeSpace, størrelse, navn fra Win32_LogicalDisk der 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 kodebit illustrerer hvordan du kan hente volumets serienummer på harddiskene i systemet.

statisk streng GetHardDiskSerialNumber (strengstasjon = "C")

        {

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

managementObject.Get ();

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

        }

For å skaffe prosessorId til prosessoren i systemet ditt, må du spesifisere "ProcessorId" i egenskapene til ManagementObject-klasseforekomst som vist i kodebiten som følger.

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

For å oppnå klokkehastigheten til prosessoren i systemet ditt, må du spesifisere "CurrentClockSpeed" i egenskapene til ManagementObject-klasseforekomst som vist i kodebiten som følger.

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

Nå som vi har utforsket programmering av WMI ved hjelp av C #, la meg fortelle deg et praktisk eksempel der du kan bruke WMI til å bruke. Jeg brukte faktisk WMI i noen av prosjektene mine for å implementere nodelåsing - en funksjon som forhindrer at et program kopieres til et annet system og blir utført på det.

Nodelåsing

La meg forklare hva jeg gjorde for å implementere nodelås og hvorfor det var nødvendig. Nodelåsing innebærer å låse en node - en node er bare et system. I hovedsak forhindrer dette konseptet at en kjørbar generert av applikasjonen din blir installert og utført i flere systemer. Jeg brukte WMI for å hente maskinvareopplysningene til systemet som applikasjonen må installeres og kjøres på. Deretter ble disse detaljene kryptert ved hjelp av en krypteringsalgoritme og deretter en unik aktiveringskode generert for det systemet. Denne koden må da brukes for å aktivere applikasjonen. Merk at noden Id eller aktiveringskoden er unik fordi de består av en kombinasjon av CPU Id og MAC Id for systemet som applikasjonen skulle installeres og kjøres på.

$config[zx-auto] not found$config[zx-overlay] not found