Bagikan melalui


Menghitung WMI

Enumerasi adalah tindakan bergerak melalui sekumpulan objek dan mungkin memodifikasi setiap objek saat Anda melakukannya. Misalnya, Anda dapat menghitung melalui sekumpulan objek Win32_DiskDrive untuk menemukan nomor seri tertentu. Perhatikan bahwa meskipun Anda dapat menghitung objek apa pun, WMI hanya mengembalikan objek yang Anda miliki akses keamanannya.

Enumerasi himpunan data besar dapat memerlukan sejumlah besar sumber daya dan menurunkan performa. Untuk informasi selengkapnya, lihat Meningkatkan Performa Enumerasi. Anda juga dapat meminta data dengan kueri yang lebih spesifik. Untuk informasi selengkapnya, lihat Mengkueri WMI.

Bagian berikut dibahas dalam topik ini:

Menghitung WMI Menggunakan PowerShell

Jika Anda tidak tahu jalur objek untuk instans tertentu, atau Anda ingin mengambil semua instans untuk kelas tertentu, gunakan Get-WmiObject, dengan nama kelas dalam parameter -class . Jika Anda ingin menggunakan kueri, Anda bisa menggunakan parameter -query .

Prosedur berikut menjelaskan cara menghitung instans kelas menggunakan PowerShell.

Untuk menghitung instans kelas menggunakan PowerShell

  1. Hitung instans dengan panggilan ke cmdlet Get-WmiObject .

    Get-WmiObject mengembalikan koleksi satu atau beberapa objek WMI, yang dapat Anda hitung. Untuk informasi selengkapnya, lihat Mengakses Koleksi.

    Jika Anda ingin mengambil instans kelas WMI di namespace layanan lain atau di komputer lain, tentukan komputer dan namespace di parameter -computer dan -namespace, masing-masing . Untuk informasi selengkapnya, lihat Membuat Skrip WMI. Ini hanya berfungsi jika Anda memiliki hak akses yang sesuai. Untuk informasi selengkapnya, lihat Memelihara Keamanan WMI dan Menjalankan Operasi Istimewa.

  2. Ambil instans individual apa pun yang Anda inginkan menggunakan anggota koleksi.

Contoh kode berikut mengambil koleksi PowerShell lalu menampilkan properti ukuran untuk semua instans drive logis di komputer lokal.

$objCol = get-wmiobject -class "Win32_LogicalDisk"

# Or, alternately
#$objCol = get-wmiobject -Query "SELECT * FROM Win32_LogicalDisk"

foreach ($Drive in $objCol)
{
    if ($Drive.size -ne $null)
    { "Drive " + $Drive.deviceID + " contains " + $Drive.size + " bytes" }
    else
    { "Drive " + $Drive.deviceID + " is not available." }
}

Menghitung WMI Menggunakan C# (Microsoft.Management.Infrastructure)

  1. Tambahkan referensi ke rakitan referensi Microsoft.Management.Infrastructure . (Rakitan ini dikirim sebagai bagian dari Kit Pengembangan Perangkat Lunak Windows (SDK) untuk Windows 8.)
  2. Tambahkan pernyataan penggunaan untuk namespace Microsoft.Management.Infrastructure .
    using Microsoft.Management.Infrastructure;
  1. Membuat instans objek CimSession . Cuplikan berikut menggunakan nilai "localhost" standar untuk metode CimSession.Create .
    CimSession cimSession = CimSession.Create("localhost");
  1. Panggil metode CimSession.QueryInstances yang melewati namespace CIM yang diinginkan dan WQL untuk digunakan. Cuplikan berikut akan mengembalikan dua instans yang mewakili dua proses Windows standar di mana properti handel (mewakili ID proses, atau PID) memiliki nilai 0 atau 4.
    IEnumerable<CimInstance> queryInstances =     
      cimSession.QueryInstances(@"root\cimv2", 
                                "WQL", 
                                @"select name from win32_process where handle = 0 or handle = 4");
  1. Perulangan melalui objek CimInstance yang dikembalikan.
    foreach (CimInstance cimInstance in enumeratedInstances)
    { 
      Console.WriteLine("Process name: {0}", cimInstance.CimInstanceProperties["Name"].Value);  
    }

Sampel kode berikut menghitung semua instans kelas Win32_Process (yang mewakili proses aktif) pada komputer lokal, dan mencetak nama setiap proses.

Catatan

Dalam aplikasi nyata, Anda akan mendefinisikan sebagai parameter nama komputer ("localhost") dan namespace CIM ("root\cimv2"). Untuk tujuan kesederhanaan, ini telah dikodekan secara permanen dalam contoh ini.

 

using System;
using System.Collections.Generic;
using Microsoft.Management.Infrastructure;

public partial class MI
{
    static void PrintCimInstance(CimInstance cimInstance)
    {
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.WriteLine("{0} properties", cimInstance.CimSystemProperties.ClassName);
        Console.ResetColor();

        Console.WriteLine(String.Format("{0,-5}{1,-30}{2,-15}{3,-10}", 
                                        "Key?", "Property", "Type", "Value"));

        foreach (var enumeratedProperty in cimInstance.CimInstanceProperties)
        {
            bool isKey = ((enumeratedProperty.Flags & CimFlags.Key) == CimFlags.Key);

            if (enumeratedProperty.Value != null)
            {
                Console.WriteLine(
                    "{0,-5}{1,-30}{2,-15}{3,-10}",
                    isKey == true ? "Y" : string.Empty,
                    enumeratedProperty.Name,
                    enumeratedProperty.CimType,
                    enumeratedProperty.Value);
            }
        }
        Console.WriteLine();
    }

    public static void QueryInstance(string query)
    {
        try
        {
            CimSession cimSession = CimSession.Create("localhost");

            IEnumerable<CimInstance> queryInstances = 
              cimSession.QueryInstances(@"root\cimv2", "WQL", query);
            foreach (CimInstance cimInstance in queryInstances)
            {
                //Use the current instance. This example prints the instance. 
                PrintCimInstance(cimInstance);
            }
        }
         catch (CimException ex) 
        { 
            // Handle the exception as appropriate.
            // This example prints the message.
            Console.WriteLine(ex.Message); 
        }
    }
}

using System;

namespace MIClientManaged
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Write(&quot;Enter WQL (x = Quit): &quot;);
                string query = Console.ReadLine().ToUpper();
                if (query.CompareTo(&quot;X&quot;) == 0) break;
                MI.QueryInstance(query);
            }
        }
    }
}

Menghitung WMI Menggunakan C# (System.Management)

Jika Anda tidak mengetahui jalur objek untuk instans tertentu, atau Anda ingin mengambil semua instans untuk kelas tertentu, gunakan objek ManagementClass untuk mengambil ManagementObjectCollection yang berisi semua instans kelas tertentu di namespace layanan WMI. Secara bergantian, Anda dapat mengkueri WMI melalui ManagementObjectSearcher untuk mendapatkan kumpulan objek yang sama.

Catatan

System.Management adalah namespace .NET asli yang digunakan untuk mengakses WMI; namun, API di namespace ini umumnya lebih lambat dan tidak menskalakan juga relatif terhadap rekan-rekan Microsoft.Management.Infrastructure yang lebih modern.

 

Prosedur berikut menjelaskan cara menghitung instans kelas menggunakan C#.

Untuk menghitung instans kelas menggunakan C #

  1. Hitung instans dengan panggilan ke ManagementClass.GetInstances.

    Metode GetInstances mengembalikan koleksi, atau set, objek yang dapat Anda hitung. Untuk informasi selengkapnya, lihat Mengakses Koleksi. Koleksi yang dikembalikan sebenarnya adalah objek ManagementObjectCollection , sehingga salah satu metode objek tersebut dapat dipanggil.

    Jika Anda ingin mengambil instans kelas WMI di namespace layanan lain atau di komputer lain, tentukan komputer dan namespace layanan di parameter jalur . Untuk informasi selengkapnya, lihat Membuat Skrip WMI. Ini hanya berfungsi jika Anda memiliki hak akses yang sesuai. Untuk informasi selengkapnya, lihat Memelihara Keamanan WMI dan Menjalankan Operasi Istimewa.

  2. Ambil instans individual apa pun yang Anda inginkan menggunakan anggota koleksi.

Contoh kode berikut mengambil koleksi C# lalu menampilkan properti ukuran untuk semua instans drive logis di komputer lokal.

using System.Management;
...

ManagementClass mc = new ManagementClass("Win32_LogicalDisk");
ManagementObjectCollection objCol = mc.GetInstances();

//or, alternately
//ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
//ManagementObjectCollection objCol = mgmtObjSearcher.Get();

if (objCol.Count != 0)
{
   foreach (ManagementObject Drive in objCol)
   {
      if (Drive["size"] != null)
      {
         Console.WriteLine("Drive {0} contains {1} bytes.", Drive["deviceID"], Drive["size"]);
      }
      else
      {
         Console.WriteLine("Drive {0} is not available.", Drive["deviceID"]);
      }
   }
}
Console.ReadLine();

Menghitung WMI Menggunakan VBScript

Jika Anda tidak mengetahui jalur objek untuk instans tertentu, atau Anda ingin mengambil semua instans untuk kelas tertentu, gunakan metode SWbemServices.InstancesOf untuk mengembalikan enumerasi SWbemObjectSet dari semua instans kelas. Atau Anda dapat mengkueri WMI melalui SWbemServices.ExecQuery untuk mendapatkan set objek yang sama.

Prosedur berikut menjelaskan cara menghitung instans kelas menggunakan VBScript.

Untuk menghitung instans kelas menggunakan VBScript

  1. Hitung instans dengan panggilan ke metode SWbemServices.InstancesOf .

    Metode InstancesOf mengembalikan koleksi, atau set, objek yang dapat Anda hitung. Untuk informasi selengkapnya, lihat Mengakses Koleksi. Koleksi yang dikembalikan sebenarnya adalah objek SWbemObjectSet , sehingga salah satu metode objek tersebut dapat dipanggil.

    Jika Anda ingin mengambil instans kelas WMI di namespace layanan lain atau di komputer lain, tentukan komputer dan namespace layanan di moniker. Untuk informasi selengkapnya, lihat Membuat Skrip WMI. Ini hanya berfungsi jika Anda memiliki hak akses yang sesuai. Untuk informasi selengkapnya, lihat Memelihara Keamanan WMI dan Menjalankan Operasi Istimewa.

  2. Ambil instans individual apa pun yang Anda inginkan menggunakan metode koleksi.

Contoh kode berikut mengambil objek SWbemServices dan kemudian menjalankan metode InstancesOf untuk menampilkan properti ukuran untuk semua instans drive logis di komputer lokal.

Set objCol = GetObject("WinMgmts:").InstancesOf("Win32_LogicalDisk")
For Each Drive In objCol
    If Not IsNull(Drive.Size) Then    
       WScript.Echo ("Drive " & Drive.deviceid & " contains " & Drive.Size & " bytes")
    Else
       WScript.Echo ("Drive " & Drive.deviceid & " is not available.")
    End If
Next

Menghitung WMI Menggunakan C++

Selain melakukan enumerasi dasar, Anda dapat mengatur beberapa bendera dan properti untuk meningkatkan performa enumerasi Anda. Untuk informasi selengkapnya, lihat Meningkatkan Performa Enumerasi.

Untuk menghitung objek yang diatur dalam WMI

  1. Buat antarmuka IEnumWbemClassObject yang menjelaskan kumpulan objek yang ingin Anda hitung.

    Objek IEnumWbemClassObject berisi daftar yang menjelaskan sekumpulan objek WMI. Anda dapat menggunakan metode IEnumWbemClassObject untuk menghitung maju, melewati objek, memulai di awal, dan menyalin enumerator. Tabel berikut mencantumkan metode yang digunakan untuk membuat enumerator untuk berbagai jenis objek WMI.

    Object Metode
    Kelas
    IWbemServices::CreateClassEnum
    [IWbemServices::CreateClassEnumAsync] (/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createclassenumasync)
    Instans
    IWbemServices::CreateInstanceEnum
    [IWbemServices::CreateInstanceEnumAsync] (/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createinstanceenumasync)
    Hasil kueri
    IWbemServices::ExecQuery
    [IWbemServices::ExecQueryAsync] (/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execqueryasync)
    Notifikasi kejadian
    IWbemServices::ExecNotificationQuery
    [IWbemServices::ExecNotificationQueryAsync] (/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execnotificationqueryasync)

     

  2. Melintasi enumerasi yang dikembalikan menggunakan beberapa panggilan ke IEnumWbemClassObject::Next atau IEnumWbemClassObject::NextAsync.

Untuk informasi selengkapnya, lihat Memanipulasi Informasi Kelas dan Instans.