Programování

Zkoumání Windows Management Instrumentation v C #

V tomto článku představím letmý pohled na technologii WMI a na to, jak můžete s WMI pracovat pomocí WMI Query Language v C #. Poté proberu scénář, kdy můžete WMI použít v reálném světě.

Co je WMI?

WMI je zkratka pro Windows Management Instrumentation, technologii společnosti Microsoft založenou na modelu COM, která se používá k načítání informací souvisejících se systémem. Tuto technologii můžete použít k načtení ID CPU, MAC ID atd. Vašeho systému. Skládá se z kolekce typů, které fungují jako obálka kolem nativních typů k načtení informací souvisejících s hardwarem. WMI usnadňuje komunikaci na nízké úrovni s hostitelským operačním systémem. Pomocí WMI můžete pracovat s čítači výkonu nebo načítat informace o hardwaru ze systému.

Pomocí rozhraní WMI můžete načíst informace o metadatech hardwaru vašeho systému, například následující:

  1. Sériové číslo HDD
  2. Velikosti HDD
  3. Volné místo na HDD
  4. Sériové číslo CPU
  5. Rychlost hodin CPU
  6. Typ patice CPU
  7. MAC adresa síťového adaptéru
  8. Výchozí brána síťového adaptéru

Máme už dost teoretických informací - pojďme se nyní zabývat nějakým kódem.

Programování WMI v C #

Následující fragment kódu používá dotaz WQL k naplnění seznamu názvy logických disků ve vašem systému. Typický dotaz WMI vypadá takto:

Vyberte * FROM Win32_Processor

Jak vidíte ve fragmentu kódu, třída SelectQuery se používá k formulování dotazu WQL.

statický seznam PopulateDisk ()

        {

List disk = nový List ();

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

ManagementObjectSearcher mnagementObjectSearcher = nový ManagementObjectSearcher (selectQuery);

foreach (ManagementObject managementObject v mnagementObjectSearcher.Get ())

            {

disk.Add (managementObject.ToString ());

       }

zpětný disk;

    }

Všimněte si, že byste měli do svého projektu zahrnout jmenný prostor System.Management (k dispozici jako součást System.Management.dll). Třídy WMI zahrnuté jako součást tohoto oboru jmen zahrnují následující:

  1. Win32_LogicalDisk - tato třída představuje zdroj dat, který odpovídá úložnému zařízení ve vašem systému. Tuto třídu můžete použít k načtení sériového čísla, dostupného volného místa a počáteční velikosti pevného disku.
  2. Win32_NetworkAdapterConfiguration - tato třída představuje atributy síťového adaptéru ve vašem systému. Tuto třídu můžete použít k načtení adresy MAC, stavu IP nebo informací o výchozí bráně IP.
  3. Win32_Processor - tato třída představuje procesor běžící v systému, na kterém je nainstalován operační systém Windows. Tuto třídu můžete použít k načtení ID CPU, stavu CPU, rychlosti hodin CPU atd. Procesorů ve vašem systému.

Chcete-li získat informace o metadatech pevných disků ve vašem systému, tj. Název, volný prostor, velikost disku atd., Můžete použít následující kód.

static void GetDiskMetadata ()

        {

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

System.Management.ObjectQuery objectQuery = new 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ázev disku:" + managementObject ["Název"]. ToString ());

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

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

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

            }

        }

Následující fragment kódu ukazuje, jak můžete načíst sériové číslo svazku pevných disků ve vašem systému.

statický řetězec GetHardDiskSerialNumber (jednotka řetězce = "C")

        {

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

managementObject.Get ();

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

        }

Chcete-li získat processorId procesoru ve vašem systému, budete muset zadat „ProcessorId“ v poli vlastností instance třídy ManagementObject, jak je ukázáno v následujícím fragmentu kódu.

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

Chcete-li získat taktovací frekvenci procesoru ve vašem systému, budete muset zadat „CurrentClockSpeed“ v poli vlastností instance třídy ManagementObject, jak je ukázáno v následujícím fragmentu kódu.

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

Nyní, když jsme prozkoumali programování WMI pomocí C #, řeknu vám praktický příklad, kde můžete WMI použít. Ve skutečnosti jsem v několika svých projektech využil WMI k implementaci zamykání uzlů - funkce, která zabraňuje kopírování aplikace do jiného systému a provádění na něm.

Uzamčení uzlu

Vysvětlím, co jsem udělal pro implementaci uzamčení uzlů a proč to bylo potřeba. Uzamčení uzlu znamená uzamčení uzlu - uzel je pouze systém. V podstatě tento koncept brání tomu, aby byl spustitelný soubor vygenerovaný vaší aplikací nainstalován a spuštěn ve více systémech. Použil jsem WMI k načtení hardwarových podrobností o systému, na kterém je třeba aplikaci nainstalovat a spustit. Dále byly tyto podrobnosti zašifrovány pomocí šifrovacího algoritmu a poté pro tento systém vygenerován jedinečný aktivační kód. Tento kód bude poté nutné použít k aktivaci aplikace. Všimněte si, že ID uzlu nebo aktivační kód jsou jedinečné, protože se skládají z kombinace ID CPU a MAC Id systému, na který měla být aplikace nainstalována a spuštěna.