Esplorazione di Strumentazione gestione Windows in C #

In questo articolo presenterò un assaggio della tecnologia WMI e di come lavorare con WMI utilizzando il linguaggio di query WMI in C #. Discuterò quindi uno scenario in cui è possibile utilizzare WMI nel mondo reale.

Cos'è WMI?

WMI è l'acronimo di Strumentazione gestione Windows, una tecnologia Microsoft basata su COM utilizzata per recuperare le informazioni relative al sistema. È possibile utilizzare questa tecnologia per recuperare l'ID CPU, l'ID MAC, ecc. Del sistema. Comprende una raccolta di tipi che fungono da wrapper attorno ai tipi nativi per recuperare le informazioni relative all'hardware. WMI facilita una comunicazione di basso livello con il sistema operativo host. È possibile utilizzare WMI per lavorare con i contatori delle prestazioni o recuperare le informazioni sull'hardware da un sistema.

È possibile utilizzare WMI per recuperare le informazioni sui metadati dell'hardware di sistema come segue:

  1. Numero di serie HDD
  2. Dimensioni HDD
  3. Spazio libero su disco fisso
  4. Numero di serie della CPU
  5. Velocità di clock della CPU
  6. Tipo di socket della CPU
  7. Indirizzo MAC dell'adattatore di rete
  8. Gateway predefinito della scheda di rete

Abbiamo avuto abbastanza informazioni teoriche: ora approfondiamo un po 'di codice.

Programmazione di WMI in C #

Il frammento di codice seguente utilizza la query WQL per popolare un elenco con i nomi dei dischi logici nel sistema. Una tipica query WMI ha il seguente aspetto:

Select * FROM Win32_Processor

Come puoi vedere nello snippet di codice, la classe SelectQuery viene utilizzata per formulare una query WQL.

static List PopulateDisk()

        {

            List disk = new List();

            SelectQuery selectQuery = new SelectQuery("Win32_LogicalDisk");

            ManagementObjectSearcher mnagementObjectSearcher = new ManagementObjectSearcher(selectQuery);

       foreach (ManagementObject managementObject in mnagementObjectSearcher.Get())

            {

           disk.Add(managementObject.ToString());

       }

            return disk;

    }

Tieni presente che dovresti includere lo spazio dei nomi System.Management (disponibile come parte di System.Management.dll) nel tuo progetto. Le classi WMI incluse come parte di questo spazio dei nomi includono quanto segue:

  1. Win32_LogicalDisk: questa classe rappresenta un'origine dati che corrisponde al dispositivo di archiviazione nel sistema. È possibile utilizzare questa classe per recuperare il numero di serie, lo spazio libero disponibile e la dimensione iniziale dell'HDD.
  2. Win32_NetworkAdapterConfiguration: questa classe rappresenta gli attributi di una scheda di rete nel sistema. È possibile utilizzare questa classe per recuperare l'indirizzo MAC, lo stato IP o le informazioni sul gateway IP predefinito.
  3. Win32_Processor: questa classe rappresenta il processore in esecuzione su un sistema in cui è installato il sistema operativo Windows. È possibile utilizzare questa classe per recuperare l'ID della CPU, lo stato della CPU, la velocità di clock della CPU, ecc. Dei processori nel sistema.

Per ottenere le informazioni sui metadati dei dischi fissi nel sistema, ovvero il nome, lo spazio libero, la dimensione del disco, ecc., È possibile utilizzare il codice seguente.

static void GetDiskMetadata()

        {

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

            System.Management.ObjectQuery objectQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

            ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher(managementScope,objectQuery);

            ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get();

            foreach (ManagementObject managementObject in managementObjectCollection)

            {

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

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

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

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

            }

        }

Il seguente frammento di codice illustra come recuperare il numero di serie del volume dei dischi rigidi nel sistema.

static string GetHardDiskSerialNumber(string drive = "C")

        {

            ManagementObject managementObject = new ManagementObject("Win32_LogicalDisk.DeviceID=\"" + drive + ":\"");

            managementObject.Get();

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

        }

Per ottenere il processorId del processore nel sistema, è necessario specificare "ProcessorId" nella matrice delle proprietà dell'istanza della classe ManagementObject come mostrato nel frammento di codice che segue.

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

Per ottenere la velocità di clock del processore nel sistema, è necessario specificare "CurrentClockSpeed" nella matrice delle proprietà dell'istanza della classe ManagementObject come mostrato nel frammento di codice che segue.

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

Ora che abbiamo esplorato la programmazione di WMI utilizzando C #, lascia che ti dica un esempio pratico in cui puoi utilizzare WMI. Ho effettivamente utilizzato WMI in alcuni dei miei progetti per implementare il blocco dei nodi, una funzionalità che impedisce a un'applicazione di essere copiata in un altro sistema e di essere eseguita su di esso.

Blocco dei nodi

Lasciatemi spiegare cosa ho fatto per implementare il blocco dei nodi e perché era necessario. Il blocco dei nodi implica il blocco di un nodo: un nodo è solo un sistema. In sostanza, questo concetto impedisce che un eseguibile generato dall'applicazione venga installato ed eseguito in più sistemi. Ho utilizzato WMI per recuperare i dettagli hardware del sistema su cui l'applicazione deve essere installata ed eseguita. Successivamente, questi dettagli sono stati crittografati utilizzando un algoritmo di crittografia e quindi un codice di attivazione univoco generato per quel sistema. Questo codice dovrà quindi essere utilizzato per attivare l'applicazione. Si noti che l'ID nodo o il codice di attivazione è univoco perché comprende una combinazione dell'ID CPU e dell'ID MAC del sistema su cui l'applicazione doveva essere installata ed eseguita.