Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 tempat Anda memiliki akses keamanan.
Enumerasi himpunan data besar dapat memerlukan sejumlah besar sumber daya dan menurunkan performa. Untuk informasi selengkapnya, lihat Meningkatkan Kinerja Enumerasi. Anda juga bisa meminta data dengan kueri yang lebih spesifik. Untuk informasi selengkapnya, lihat Mengkueri WMI.
Bagian berikut dibahas dalam topik ini:
- Menghitung WMI Menggunakan PowerShell
- Menghitung WMI Menggunakan C# (Microsoft.Management.Infrastructure)
- Enumerasi WMI Menggunakan C# (System.Management)
- Menghitung WMI Menggunakan VBScript
- Menghitung WMI Menggunakan C++
Mengenumerasi WMI Menggunakan PowerShell
Jika Anda tidak mengetahui 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
Mendaftar 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 -computer dan -namespace parameter. 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.
Gunakan anggota koleksi untuk mengakses setiap instans yang Anda butuhkan.
Contoh kode berikut mengambil sebuah koleksi PowerShell lalu menampilkan properti ukuran dari setiap 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)
- Tambahkan referensi ke rakitan referensi Microsoft.Management.Infrastructure. (Rakitan ini dikirim sebagai bagian dari Windows Software Development Kit (SDK) untuk Windows 8.)
- Tambahkan menggunakan pernyataan untuk namespace Microsoft.Management.Infrastructure.
using Microsoft.Management.Infrastructure;
- Membuat instans objek CimSession. Cuplikan berikut menggunakan nilai "localhost" standar untuk metode CimSession.Create.
CimSession cimSession = CimSession.Create("localhost");
- Panggil metode CimSession.QueryInstances dengan meneruskan namespace CIM dan WQL yang diinginkan untuk digunakan. Cuplikan berikut akan mengembalikan dua instans yang mewakili dua proses Windows standar di mana properti handle (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");
- Iterasi terhadap 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.
Nota
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("Enter WQL (x = Quit): ");
string query = Console.ReadLine().ToUpper();
if (query.CompareTo("X") == 0) break;
MI.QueryInstance(query);
}
}
}
}
Mengenumerasi WMI dengan 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.
Nota
System.Management adalah namespace .NET asli yang digunakan untuk mengakses WMI; namun, API dalam namespace ini umumnya lebih lambat dan tidak dapat diskalakan dengan baik jika dibandingkan dengan mitra Microsoft.Management.Infrastructure yang lebih modern.
Prosedur berikut menjelaskan cara menghitung instans kelas menggunakan C#.
Untuk menghitung instans kelas menggunakan C#
Enumerasi 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 instance kelas WMI di namespace lain atau di komputer berbeda, tentukan komputer dan namespace pada 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.
Dapatkan instance 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 SWbemObjectSet enumerasi 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
Daftarkan 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 objekSWbemObjectSet, sehingga salah satu metode objek tersebut dapat dipanggil.
Jika Anda ingin mengambil instans kelas WMI di namespace lain atau di komputer lain, tentukan komputer dan namespace 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.
Dapatkan instans individu mana saja yang Anda inginkan menggunakan metode pengumpulan.
Contoh kode berikut mengambil objekSWbemServiceslalu 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 lebih jelasnya, lihat Meningkatkan Performa Enumerasi.
Untuk menghitung objek yang ditetapkan di WMI
Buat antarmukaIEnumWbemClassObjectyang menjelaskan kumpulan objek yang ingin Anda hitung.
ObjekIEnumWbemClassObjectberisi 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.
Benda Metode Kelas -
IWbemServices::CreateClassEnum
[IWbemServices::CreateClassEnumAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-createclassenumasync)
Sebagai contoh -
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)
Pemberitahuan peristiwa -
IWbemServices::ExecNotificationQuery
[IWbemServices::ExecNotificationQueryAsync](/windows/desktop/api/WbemCli/nf-wbemcli-iwbemservices-execnotificationqueryasync)
Menelusuri enumerasi yang dikembalikan dengan menggunakan beberapa panggilan ke IEnumWbemClassObject::Next atau IEnumWbemClassObject::NextAsync.
Untuk informasi selengkapnya, lihat Memanipulasi Informasi Kelas dan Instans.