Programovanie

Preskúmanie Windows Management Instrumentation v C #

V tomto článku predstavím pohľad na technológiu WMI a na to, ako môžete pracovať s WMI pomocou jazyka WMI Query Language v jazyku C #. Potom prediskutujem scenár, v ktorom môžete WMI využiť v skutočnom svete.

Čo je to WMI?

WMI je skratka pre Windows Management Instrumentation, technológiu spoločnosti Microsoft založenú na COM, ktorá sa používa na načítanie informácií týkajúcich sa systému. Túto technológiu môžete použiť na získanie ID procesora, MAC ID atď. Vo vašom systéme. Skladá sa z kolekcie typov, ktoré fungujú ako obálka okolo natívnych typov na získanie informácií týkajúcich sa hardvéru. WMI umožňuje komunikáciu na nízkej úrovni s hostiteľským operačným systémom. Pomocou rozhrania WMI môžete pracovať s počítadlami výkonu alebo načítať hardvérové ​​informácie zo systému.

Pomocou rozhrania WMI môžete načítať informácie o metaúdajoch hardvéru systému, ako napríklad:

  1. Sériové číslo pevného disku
  2. Veľkosti HDD
  3. HDD voľný priestor
  4. Sériové číslo CPU
  5. Taktovacia rýchlosť procesora
  6. Typ pätice CPU
  7. Adresa MAC sieťového adaptéra
  8. Predvolená brána sieťového adaptéra

Máme už dosť teoretických informácií - poďme sa teraz venovať nejakému kódu.

Programovanie WMI v C #

Nasledujúci úryvok kódu používa dopyt WQL na vyplnenie zoznamu s názvami logických diskov vo vašom systéme. Typický dotaz WMI vyzerá takto:

Vyberte možnosť * FROM Win32_Processor

Ako môžete vidieť v útržku kódu, trieda SelectQuery sa používa na formuláciu dotazu WQL.

statický zoznam PopulateDisk ()

        {

Zoznam disku = nový Zoznam ();

SelectQuery selectQuery = nový SelectQuery ("Win32_LogicalDisk");

ManagementObjectSearcher mnagementObjectSearcher = nový ManagementObjectSearcher (selectQuery);

foreach (ManagementObject managementObject v mnagementObjectSearcher.Get ())

            {

disk.Add (managementObject.ToString ());

       }

spätný disk;

    }

Pamätajte, že do svojho projektu by ste mali zahrnúť menný priestor System.Management (dostupný ako súčasť System.Management.dll). Triedy WMI zahrnuté ako súčasť tohto priestoru mien zahŕňajú:

  1. Win32_LogicalDisk - táto trieda predstavuje zdroj údajov, ktorý zodpovedá úložnému zariadeniu vo vašom systéme. Túto triedu môžete použiť na získanie sériového čísla, voľného miesta a počiatočnej veľkosti pevného disku.
  2. Win32_NetworkAdapterConfiguration - táto trieda predstavuje atribúty sieťového adaptéra vo vašom systéme. Túto triedu môžete použiť na získanie adresy MAC, stavu IP alebo informácií o predvolenej bráne IP.
  3. Win32_Processor - táto trieda predstavuje procesor bežiaci na systéme, ktorý má nainštalovaný operačný systém Windows. Túto triedu môžete použiť na získanie ID procesora, stavu procesora, rýchlosti procesora atď. Procesorov vo vašom systéme.

Ak chcete získať informácie o metadátach pevných diskov vo vašom systéme, t. J. Názov, voľný priestor, veľkosť disku atď., Môžete použiť nasledujúci kód.

static void GetDiskMetadata ()

        {

System.Management.ManagementScope managementScope = nový System.Management.ManagementScope ();

System.Management.ObjectQuery objectQuery = nový System.Management.ObjectQuery ("vyberte FreeSpace, Size, Name z Win32_LogicalDisk kde DriveType = 3");

ManagementObjectSearcher managementObjectSearcher = nový ManagementObjectSearcher (managementScope, objectQuery);

ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get ();

foreach (ManagementObject managementObject v managementObjectCollection)

            {

Console.WriteLine ("Názov disku:" + managementObject ["Názov"]. ToString ());

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

Console.WriteLine ("Veľkosť disku:" + managementObject ["Veľkosť"]. ToString ());

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

            }

        }

Nasledujúci úryvok kódu ilustruje, ako môžete získať sériové číslo zväzku pevných diskov vo vašom systéme.

statický reťazec GetHardDiskSerialNumber (reťazec drive = "C")

        {

ManagementObject managementObject = nový ManagementObject ("Win32_LogicalDisk.DeviceID = \" "+ jednotka +": \ "");

managementObject.Get ();

návrat managementObject ["VolumeSerialNumber"]. ToString ();

        }

Ak chcete získať processorId procesora vo vašom systéme, musíte zadať „ProcessorId“ v poli vlastností inštancie triedy ManagementObject, ako je uvedené v nasledujúcom útržku kódu.

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

Aby ste dosiahli rýchlosť procesora vo vašom systéme, musíte v poli vlastností inštancie triedy ManagementObject zadať hodnotu „CurrentClockSpeed“, ako je uvedené v nasledujúcom útržku kódu.

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

Teraz, keď sme preskúmali programovanie WMI pomocou C #, poviem vám praktický príklad, kde môžete WMI využiť. Vlastne som v niekoľkých svojich projektoch využil WMI na implementáciu blokovania uzlov - funkciu, ktorá zabraňuje kopírovaniu aplikácie do iného systému a jeho vykonaniu na ňom.

Uzamknutie uzla

Vysvetlím, čo som urobil pri implementácii blokovania uzlov a prečo bolo potrebné. Uzamknutie uzla znamená uzamknutie uzla - uzol je iba systém. Tento koncept v podstate bráni tomu, aby bol spustiteľný súbor vygenerovaný vašou aplikáciou nainštalovaný a spustený vo viacerých systémoch. Použil som WMI na získanie hardvérových detailov systému, na ktorý je potrebné aplikáciu nainštalovať a spustiť. Ďalej boli tieto podrobnosti šifrované pomocou šifrovacieho algoritmu a potom pomocou jedinečného aktivačného kódu vygenerovaného pre tento systém. Tento kód sa potom bude musieť použiť na aktiváciu aplikácie. Upozorňujeme, že ID uzla alebo aktivačný kód sú jedinečné, pretože pozostávajú z kombinácie ID CPU a MAC Id systému, na ktorý sa mala aplikácia nainštalovať a spustiť.