Meneroka Instrumentasi Pengurusan Windows di C #

Dalam artikel ini, saya akan memberikan gambaran ringkas mengenai teknologi WMI dan bagaimana anda dapat bekerjasama dengan WMI menggunakan Bahasa Pertanyaan WMI di C #. Saya kemudian akan membincangkan senario di mana anda boleh menggunakan WMI di dunia nyata.

Apa itu WMI?

WMI adalah akronim untuk Windows Management Instrumentation, teknologi Microsoft berasaskan COM yang digunakan untuk mengambil maklumat berkaitan sistem. Anda boleh menggunakan teknologi ini untuk mendapatkan ID CPU, MAC ID, dll dari sistem anda. Ini terdiri dari kumpulan jenis yang bertindak sebagai pembungkus di sekitar jenis asli untuk mengambil maklumat berkaitan perkakasan. WMI memudahkan komunikasi peringkat rendah dengan Sistem Operasi tuan rumah. Anda boleh menggunakan WMI untuk bekerja dengan kaunter prestasi atau mengambil maklumat perkakasan dari sistem.

Anda boleh menggunakan WMI untuk mendapatkan maklumat metadata perkakasan sistem anda seperti berikut:

  1. Nombor Siri HDD
  2. Saiz HDD
  3. Ruang Bebas HDD
  4. Nombor Siri CPU
  5. Kelajuan Jam CPU
  6. Jenis Soket CPU
  7. Alamat MAC Penyesuai Rangkaian
  8. Gerbang Lalai Penyesuai Rangkaian

Kami mempunyai maklumat teori yang cukup - mari kita menggali beberapa kod.

Pengaturcaraan WMI dalam C #

Coretan kod berikut menggunakan pertanyaan WQL untuk mengisi senarai dengan nama-nama cakera logik dalam sistem anda. Pertanyaan khas WMI kelihatan seperti ini:

Select * FROM Win32_Processor

Seperti yang anda lihat dalam coretan kod, kelas SelectQuery digunakan untuk merumuskan pertanyaan 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;

    }

Perhatikan bahawa anda harus memasukkan ruang nama System.Management (tersedia sebagai sebahagian daripada System.Management.dll) dalam projek anda. Kelas WMI yang disertakan sebagai sebahagian daripada ruang nama ini merangkumi yang berikut:

  1. Win32_LogicalDisk - kelas ini mewakili sumber data yang sesuai dengan peranti storan dalam sistem anda. Anda boleh menggunakan kelas ini untuk mendapatkan nombor siri, ruang kosong yang tersedia dan ukuran awal HDD.
  2. Win32_NetworkAdapterConfiguration - kelas ini mewakili atribut penyesuai rangkaian dalam sistem anda. Anda boleh menggunakan kelas ini untuk mendapatkan alamat MAC, status IP atau maklumat gateway IP lalai.
  3. Win32_Processor - kelas ini mewakili pemproses yang berjalan pada sistem yang memasang sistem operasi windows. Anda dapat menggunakan kelas ini untuk mengambil Id CPU, status CPU, kelajuan jam CPU, dll dari prosesor dalam sistem anda.

Untuk mendapatkan maklumat metadata cakera tetap dalam sistem anda, iaitu, nama, ruang bebas, ukuran cakera, dan lain-lain, anda boleh menggunakan kod berikut.

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("---------------------------------------------------");

            }

        }

Coretan kod berikut menggambarkan bagaimana anda boleh mendapatkan nombor siri jumlah cakera keras dalam sistem anda.

static string GetHardDiskSerialNumber(string drive = "C")

        {

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

            managementObject.Get();

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

        }

Untuk mendapatkan processorId prosesor dalam sistem anda, anda perlu menentukan "ProcessorId" dalam array sifat instance kelas ManagementObject seperti yang ditunjukkan dalam coretan kod yang berikut.

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

Untuk mendapatkan kelajuan jam prosesor dalam sistem anda, anda perlu menentukan "CurrentClockSpeed" dalam array sifat contoh kelas ManagementObject seperti yang ditunjukkan dalam potongan kode yang berikut.

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

Sekarang setelah kita menjelajah program WMI menggunakan C #, izinkan saya memberitahu anda contoh praktikal di mana anda boleh menggunakan WMI. Saya sebenarnya menggunakan WMI dalam beberapa projek saya untuk melaksanakan penguncian nod - satu ciri yang menghalang aplikasi daripada disalin ke sistem lain dan dijalankan di atasnya.

Mengunci nod

Izinkan saya menjelaskan apa yang saya lakukan untuk melaksanakan penguncian nod dan mengapa ia diperlukan. Penguncian nod bermaksud mengunci nod - simpul hanyalah sistem. Pada dasarnya, konsep ini menghalang pelaksanaan yang dihasilkan oleh aplikasi anda daripada dipasang dan dijalankan dalam pelbagai sistem. Saya menggunakan WMI untuk mendapatkan butiran perkakasan sistem di mana aplikasi perlu dipasang dan dijalankan. Seterusnya, butiran ini dienkripsi menggunakan algoritma penyulitan dan kemudian kod pengaktifan unik yang dihasilkan untuk sistem tersebut. Kod ini kemudiannya harus digunakan untuk mengaktifkan aplikasi. Perhatikan bahawa simpul Id atau kod pengaktifan adalah unik kerana terdiri daripada gabungan Id CPU dan Id MAC sistem di mana aplikasi itu akan dipasang dan dijalankan.