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í:
- Sériové číslo HDD
- Velikosti HDD
- Volné místo na HDD
- Sériové číslo CPU
- Rychlost hodin CPU
- Typ patice CPU
- MAC adresa síťového adaptéru
- 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í:
- 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.
- 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.
- 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.